J'ai récemment essayé cette expérience dans laquelle au lieu d'aller pour une allocation de mémoire dynamique pour les exigences de mémoire de la taille inconnue, j'ai fait une allocation statique. Lorsqu'un tableau A [i] code> a été déclaré par moi, j'ai conservé
i code> (taille de la matrice) et dépend de l'entrée que l'utilisateur donne.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
void function(int );
int main(void)
{
int i;
printf("Enter:");
scanf("%d",&i);
function(i);
printf("i = %d\n",i);
getch();
return 0;
}
void function(int i)
{
char a[i];
char b[4];
strncpy(a,"hello",i);
strcpy(b,"world");
int j = 0;
char *c = a;
for( j = 0; j< 20; j++ )
printf("%c",*c++);
}
6 Réponses :
Ceci est légal, mais tous les compilateurs ne le soutiennent pas. Au moins Visual Studio <= 2003 AFAIK ne le supporte pas. P>
Je suppose que ce n'était pas Ansi C ++, essayez de GCC -ansi -peantic. P>
Ceci est valide C99 . P>
look ici < / a> Pour une explication plus détaillée dans une autre question Stackoverflow. P>
Les matrices de longueur variable sont illégales dans ANSI C (C89). Essayez de monter le niveau d'avertissement de votre compilateur et je suis sûr que vous obtiendrez un avertissement / une erreur. P>
est une telle opération légale? p>
C'est ce qu'on appelle une matrice de longueur variable. p>
VLAS est légal dans ANSI C99 et comme extension à certains compilateurs de Pre-C99. GCC le supporte à la fois comme strict C99 et comme extension du code non-C99. C'est aussi légal en C ++ 0x. P>
Si non, pourquoi le compilateur n'est-il pas émettre d'avertissement ou d'erreur? p> blockquote>
avec GCC: p>
xxx pré> La présence de "conio.h" de MSDOS indique que vous utilisez probablement un compilateur Microsoft Visual C ++, donc Don ' t vous soucier de ça. MS a travaillé pour rendre leur compilateur plus conforme à la norme C ++ 0X, mais ne fait aucune allégation sur la manière dont le mode STORN STI ST Compiler est. Vous demandez pourquoi les mots de dialecte espagnol ne sont pas dans le dictionnaire français. P>
Où cette mémoire sera-t-elle allouée: pile ou tas? P> blockQuote>
C'est un objet automatique, la plupart des implémentations C mettront la pile pour des raisons d'efficacité. P>
Pourquoi ANSI C / GCC permet à cette p> blockQuote>
Il est utile de créer des matrices temporaires de taille variable au moment de l'exécution dont la durée de vie n'apparaît pas au-delà de l'appel de la fonction. P> blockQquote>
ISO C99 a été adopté par ANSI en 2000 - il n'existe pas d'ANSI C99
Il n'y a "rien de tel" que l'ISO C99 soit - cela s'appelle ISO / CEI 9899: 1999. ANSI C99 est la version de C normalisée en 1999, communément appelée C99, adoptée par ANSI.
Le code est valide, mais il y a une chose à garder à l'esprit lorsque vous utilisez des tableaux de longueur variable.
void function(int i) { int a[i]; . . }
Allocation de mémoire dynamique sur la pile: p>
Il existe une bibliothèque appel _Malloca qui alloue de la mémoire de manière dynamique sur la pile de programmes (beaucoup comme Malloc fait sur tas) P>
Référence: _Malloca p>
Quelles options avez-vous utilisées pour compiler cela? Qu'avez-vous vu quand vous avez couru cela? Vous devriez essayer d'imprimer la chaîne le pointeur C pointe sur.