web-dev-qa-db-fra.com

Déclarer la taille du tableau avec une variable non constante

J'ai toujours pensé que lors de la déclaration d'un tableau en C++, la taille devait être une valeur entière constante.

Par exemple :

int MyArray[5]; // correct

ou

const int ARRAY_SIZE = 6;
int MyArray[ARRAY_SIZE]; // correct

mais

int ArraySize = 5;
int MyArray[ArraySize]; // incorrect

Voici également ce qui est expliqué dans Le langage de programmation C++, par Bjarne Stroustrup :

Le nombre d'éléments du tableau, le tableau lié, doit être une expression constante (§C.5). Si vous avez besoin de bornes de variables, utilisez un vecteur (§3.7.1, §16.3). Par exemple: 

void f(int i) { 
   int v1[i];          // error : array size not a constant expression
   vector<int> v2(i);  // ok 
} 

Mais à ma grande surprise, le code ci-dessus compile bien sur mon système!

Voici ce que j'ai essayé de compiler:

void f(int i) {
   int v2[i];
}

int main()
{
   int i = 3;
   int v1[i];
   f(5);
}

Je n'ai pas d'erreur! J'utilise GCC v4.4.0.

Y a-t-il quelque chose qui me manque?

27
Jérôme

Ceci est une extension de la norme GCC: voir ici .

Vous pouvez utiliser l'option -pedantic pour que GCC émette un avertissement, ou -std=c++98 pour générer une erreur, lorsque vous utilisez l'une de ces extensions (au cas où la portabilité poserait un problème).

27
Dean Harding

Vous utilisez une fonctionnalité de C99 appelée VLA (tableaux de longueur variable). Ce serait mieux si vous compilez votre programme comme ceci:

g++ -Wall -std=c++98 myprog.cpp
5
AraK

Vous pouvez également utiliser la fonction alloca pour obtenir un effet très semblable à Des tableaux de longueur variable. Il est disponible sur VS aussi.

alloca - alloue de la mémoire libérée automatiquement. La fonction Alloca () alloue des octets de taille dans la trame de pile De l'appelant. Cet espace temporaire est automatiquement libéré lorsque la fonction Qui a appelé alloca () est retournée à l'appelant. La fonction alloca () Est dépendante de la machine et du compilateur . Pour certaines applications , Son utilisation peut améliorer l'efficacité par rapport à l'utilisation de Malloc (3) plus free (3).

0
Dmytro Dadyka