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?
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).
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
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).