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.

50
c
demandé sur Rakete1111 2009-04-10 14:21:05

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.

51
répondu Mehrdad Afshari 2009-04-10 10:36:35

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.

18
répondu jpalecek 2009-04-10 11:00:25

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

7
répondu Özgür 2009-04-10 10:29:50

Il est valide C99, il N'est pas valide c++. C'est l'un d'un certain nombre de différences entre les deux langues.

4
répondu 2009-04-10 10:33:33

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.

0
répondu Najeeb 2013-03-05 07:05:07

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;
}
0
répondu Dungeon 2015-09-03 20:19:12

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.

-1
répondu Elkvis 2014-10-13 14:38:02