web-dev-qa-db-fra.com

La taille du tableau au moment de l'exécution sans allocation dynamique est-elle autorisée?

J'utilise le 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 déterminer la taille 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 supposés donner une erreur de taille de stockage.

Même le programme C++ de Deitel, p. 261 états sous Common Programming Error 4.5: 

Seules des constantes peuvent être utilisées pour déclarer la taille des tableaux automatiques et statiques.

Éclaire moi.

53
syaz

Ceci est valable en C99. 

La norme C99 prend en charge les tableaux de taille variable sur la pile. Votre compilateur a probablement choisi de supporter également cette construction.

Notez que cela diffère de malloc et new. gcc alloue le tableau sur la pile, comme avec int array[100] en ajustant simplement le pointeur de la pile. Aucune allocation de tas n'est effectuée. C'est un peu comme _alloca .

52
Mehrdad Afshari

C'est ce qu'on appelle les VLA (tableaux de longueur variable). C'est standard dans c99, mais gcc le permet dans le code c ++ en tant qu'extension. Si vous souhaitez que le code soit rejeté, essayez d’utiliser les options -std=standard, -ansi et -pedantic.

19
jpalecek

Il est valide uniquement en C99. La prochaine fois que vous pourrez essayer de vérifier votre code dans un compilateur fiable .

6
Özgür

C'est valide C99, ce n'est pas valide C++. C'est l'une des nombreuses différences entre les deux langues.

4
anon

Ce code est exécuté 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;
}
0
Dungeon

Vous pouvez redimensionner dynamiquement un tableau si vous utilisez le compilateur Dev-Cpp, je l’ai essayé Et n’ai aucune erreur, mais sur Visual C++ et les compilateurs Visual Studio, il est impossible .. dev-c ++ assigne un nombre positif à l'int .__ non initialisée. Lorsque nous lui attribuons un nombre, il est remplacé par celui donné . mais peut-être que d'autres compilateurs donnent null aux variables non initialisées.

0
Najeeb