Taille de tableau à l'exécution sans allocation dynamique est autorisée?
-
09-09-2019 - |
Question
J'utilise C ++ depuis quelques années, et aujourd'hui, je voyais un peu de code, mais comment peut-il être parfaitement légal?
int main(int argc, char **argv)
{
size_t size;
cin >> size;
int array[size];
for(size_t i = 0; i < size; i++)
{
array[i] = i;
cout << i << endl;
}
return 0;
}
Compilé sous GCC.
Comment la taille peut être déterminée à l'exécution sans new
ou malloc
?
Il suffit de vérifier, j'ai googlé certains et tous les codes semblables à la mienne sont réclamés pour donner une erreur de taille de stockage.
Même de Deitel C ++ Comment programmer p. 261 états sous erreur de programmation commune 4.5:
Seules les constantes peuvent être utilisées pour déclarer la taille des tableaux automatiques et statiques.
Enlight moi.
La solution
Ceci est valable dans C99.
C99 norme prend en charge des réseaux de taille variable sur la pile. Probablement votre compilateur a choisi de soutenir cette construction aussi.
Notez que ceci est différent de malloc
et new
. gcc
attribue le tableau sur la pile, comme il le fait avec int array[100]
simplement en ajustant le pointeur de la pile. Aucune allocation de tas est fait. Il est à peu près comme _alloca
.
Autres conseils
Ceci est connu comme VLA (Les tableaux de longueur variable). Il est standard dans C99, mais gcc permet en c ++ code comme une extension. Si vous voulez rejeter le code, essayez d'expérimenter avec des options -std=standard
, -ansi
et -pedantic
.
Il est valide que dans C99. La prochaine fois que vous pouvez essayer de vérifier votre code dans un compilateur fiable .
Il est valable C99, il n'est pas valide C ++. Ceci est l'un des pas quelques différences entre les deux langues.
Vous pouvez donner la taille d'un tableau dynamique si vous utilisez le compilateur Dev-Cpp Je l'ai essayé et a obtenu aucune erreur mais c ++ visuelle et compilateurs studio visuels, il est impossible. Je pense que la raison en est que c ++-dev attribue un nombre positif à l'int uninitialized et quand on lui donne un numéro, il est remplacé par celui donné. mais peut-être d'autres compilateurs donnent nulle à des variables non initialisées.
Ce code fonctionne dans GNU compilateur GCC.
#include<bits/stdc++.h>
int main(int argc, char **argv)
{
size_t size;
std:: cin >> size;
int array[size];
for(size_t i = 0; i < size; i++)
{
array[i] = i;
std:: cout << i;
}
return 0;
}
Tableaux de longueur variable (VLA) sont pris en charge dans la norme C ++ 14, qui a récemment été acceptée et est en attente de publication.