IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ C et erreurs courantes

Ce ou ces sujets font partie d'une FAQ en cours d'écriture, vos retours sont les bienvenus.

Les VLA, ou tableaux de taille variable apparus avec la norme C99, sont en quelque sorte des intermédiaires entre :

  • les tableaux statiques stockés sur la pile dont la taille est connue à la compilation ;
  • les tableaux dynamiques alloués sur le tas, dont la taille n'est connue que durant l'exécution.

Ils sont déclarés avec la même syntaxe que les tableaux statiques :

 
Sélectionnez
Type tableau[n];

et sont comme eux stockés sur la pile. La différence est que la taille n est une variable dont la valeur n'est connue qu'à l'exécution, ce n'est pas une constante connue à la compilation.

Ils offrent l'avantage de ne pas avoir à se préoccuper de la gestion de la mémoire : ils sont automatiquement libérés dès que l'on sort de la portée dans laquelle ils sont…

… MAIS un gros désavantage par rapport aux tableaux alloués : leur taille reste limitée à celle de la pile qui reste de l'ordre de quelques Mo. Et si par mégarde, vous tentez de créer un tableau VLA trop conséquent, vous ferez directement planter votre programme (segmentation fault).

Prenez donc garde à n'utiliser les VLA que lorsque vous êtes sûrs de manipuler des tableaux de taille raisonnable.

Faites aussi attention à ce que la variable n soit correctement initialisée avant de déclarer votre VLA. Il m'est déjà arrivé de croiser les codes suivants sur le forum :

1)
 
Sélectionnez
1.
2.
3.
4.
int n;
int tableau[n]; // n n'a pas été initialisé => UB
printf("Taille du tableau : ");
scanf("%d", &n);
 
Sélectionnez
int n;
printf("Taille du tableau : ");
if (scanf("%d", &n) == 1) {
    int tableau[n];
2)
 
Sélectionnez
1.
2.
3.
4.
int n = 0;
int tableau[n]; // taille nulle
printf("Taille du tableau : ");
scanf("%d", &n);

Le tableau est créé sur la ligne 2 avec…

  1. une taille n non initialisée à ce moment très précis, entraînant un UBQu'est-ce qu'un « comportement indéfini » (Undefined Behaviour / « UB ») ?, possiblement un crash à cause d'une taille (aléatoire) trop importante ou par la suite à cause d'un accès en dehors de cette fausse taille initiale ;
  2. une taille nulle ne permettant de stocker aucun élément et toute tentative d'accès se faisant en dehors du tableau.

Notez que modifier la valeur de n par la suite ne modifiera pas la taille du tableau, sa taille d'origine est définitive.

Les VLA n'existent que dans le standard C depuis la norme C99 mais PAS dans le standard C++, et ce quelle que soit la norme. Il est possible que votre compilateur C++ les supporte, mais ce n'est qu'une extension. Vous pouvez ajouter l'option de compilation -pedantic ou -pedantic-errors pour vous en convaincre.

Utilisez à la place la classe std::vector en C++.

À voir également

Créé le 13 décembre 2017  par Winjerome

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2022 Winjerome. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.