2009-12-08 24 views
8

pourquoi pouvons-nous faire cela dans c? Je pensais que le tableau est situé dans la mémoire pendant le temps de chargement, mais il semble que l'exemple ci-dessus fonctionne pendant l'exécution. Est-ce que je me méprends sur quelque chose? pouvez-vous aider les gars?pourquoi un [n] est accepté dans c pendant l'exécution?

Merci,

+0

Il est également prévu comme une extension de g ++ bien VLA ne fait pas partie de C++ (mais une partie de C++ 0x). –

+0

L'extension C++ n'inclut pas la prise en charge des références à un type de tableau de longueur variable; un paramètre de fonction ne peut pas non plus être une référence à un type de tableau de longueur variable (IBM C++) –

+2

Non, il ne fera pas partie de C++ 0x. –

Répondre

6

I thought array is *al*located memory during load time but seems like the above example works during run-time.

Oui, ordinaire des tableaux comme <datatype> <Array_Name> [<size>] sont alloués mémoire pendant le temps de chargement il est là en C89 et existait aussi en C99. Mais dans l'extrait de code int a[n]; est un Variable Length Array ou VLA pour court.VLA dans C99 sont définis comme n'importe quel autre tableau, sauf que la longueur n'a pas besoin d'être une constante de compilation.

Un article décent sur la nécessité de VLA se trouvent ici: http://www.ddj.com/cpp/184401444 :)

9

Je ne suis pas expert en C, mais cela pourrait être un variable-length array tel qu'ajouté par C99 et supported by GCC, par exemple. GCC alloue la mémoire pour un tel tableau sur la pile, afin qu'il soit automatiquement libéré lorsque vous revenez de la fonction.

+0

Ceci est VLA (fonctionnalité C99), pourquoi n'êtes-vous pas sûr? –

+0

J'ai dit que je n'étais pas experte en C, car même si je sais qu'il existe des VLA, je ne les ai jamais utilisés et je n'étais pas sûr à 100% que c'était ce dont parlait l'affiche. – zoul

7

ne sont pas trouvés dans C89, mais sont une nouvelle fonctionnalité dans C99.

0

Étant donné que votre code est écrit (en particulier, que vous avez une déclaration), il doit s'agir de code dans une fonction.

Bien que je ne sache pas si cela est strictement requis dans la spécification, dans une fonction, tous les tableaux automatiques (c'est-à-dire, au niveau de la fonction, et non statiques) sont placés sur la pile. Ainsi, que vous disposiez d'un tableau régulier ou VL, la mémoire est allouée au moment de l'exécution.

La mémoire pour les baies non-auto n'est pas gérée lors de l'exécution, donc ne supporte pas VLA. Si vous essayez de compiler le code suivant:

extern int size; 
char buff1[size]; 

void doit(int x) 
{ 
    static int buff2[x]; 
    int buff3[x]; 
} 

Sur le compilateur je l'ai testé ceci sur (gcc 4.2.1), je me suis erreurs suivantes:

moo.c:2: error: variably modified ‘buff1’ at file scope 
moo.c: In function ‘doit’: 
moo.c:6: error: storage size of ‘buff2’ isn’t constant