La taille du tableau au moment de l'exécution sans allocation dynamique est autorisée?
J'utilise C++ depuis quelques années, et aujourd'hui j'ai vu du code, mais comment cela 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 sera déterminée au moment de l'exécution, sans new
ou malloc
?
Juste pour vérifier, j'ai googlé certains et tous les codes similaires au mien sont censés donner une erreur de taille de stockage.
Même le C++ de Deitel 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.
Éclairez-moi.
7 réponses
Ceci est valide en C99.
La norme C99 prend en charge les tableaux de taille variable sur la pile. Probablement votre compilateur a choisi de prendre en charge cette construction aussi.
Notez que ceci est différent de malloc
et new
. gcc
alloue le tableau sur la pile, tout comme avec int array[100]
en ajustant simplement le pointeur de la pile. Aucune allocation de tas n'est effectuée. Il est à peu près comme _alloca
.
Ceci est connu comme VLAs (tableaux de longueur variable). Il est standard en c99, mais gcc l'autorise en code C++ comme extension. Si vous le souhaitez rejeter le code, essayez d'expérimenter avec -std=standard
, -ansi
et -pedantic
options.
Il est valide uniquement en C99. La prochaine fois, vous pouvez essayer de vérifier votre code dans un compilateur fiable .
Vous pouvez donner de la taille à un tableau dynamiquement si vous utilisez le compilateur Dev-Cpp je l'ai essayé et n'a pas eu d'erreur mais sur les compilateurs visual C++ et visual studio, ce n'est pas possible. Je pense que la raison en est que dev-c ++ attribue un nombre positif à l'int non initialisé et quand nous lui donnons un nombre, il est remplacé par celui donné. mais peut-être que d'autres compilateurs donnent null aux variables non initialisées.
CE Code s'exécute dans le compilateur GNU 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;
}
Les tableaux de longueur Variable (VLAs) sont pris en charge dans la norme C++14, qui a récemment été acceptée, et est en attente de publication.