web-dev-qa-db-fra.com

Erreur de compilation C: "Un objet de taille variable ne peut pas être initialisé"

Pourquoi reçois-je l'erreur "Un objet de taille variable ne peut pas être initialisé" avec le code suivant? 

int boardAux[length][length] = {{0}};
70
helloWorld

Je suppose que vous utilisez un compilateur C99 (prenant en charge les tableaux de taille dynamique). Le problème dans votre code est qu'au moment où les compilateurs voient votre déclaration de variable, il ne peut pas savoir le nombre d'éléments contenus dans le tableau (je suppose également ici, d'après l'erreur du compilateur que length n'est pas une constante de temps de compilation). 

Vous devez initialiser manuellement ce tableau:

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );

Vous recevez cette erreur car, en langage C, vous n'êtes pas autorisé à utiliser des initialiseurs avec des tableaux de longueur variable. Le message d'erreur que vous obtenez en gros dit tout.

6.7.8 Initialisation

...

3 Le type de l'entité à initialiser doit être un tableau de taille inconnue ou un objet tapez qui n'est pas une longueur variable type de tableau.

20
AnT

Cela donne une erreur: 

int len;
scanf("%d",&len);
char str[len]="";

Cela donne aussi une erreur:

int len=5;
char str[len]="";

Mais cela fonctionne bien:

int len=5;
char str[len]; //so the problem lies with assignment not declaration

Vous devez mettre en valeur de la manière suivante:

str[0]='a';
str[1]='b'; //like that; and not like str="ab";
10
Amitesh Ranjan

Après avoir déclaré le tableau

int boardAux[length][length];

le moyen le plus simple d'affecter les valeurs initiales à zéro est d'utiliser la boucle for, même si elle est un peu longue

int i, j;
for (i = 0; i<length; i++)
{
    for (j = 0; j<length; j++)
        boardAux[i][j] = 0;
}
1
Krishna Shrestha

Déclarez simplement que la longueur est un inconvénient, sinon, vous devriez allouer de la mémoire de manière dynamique.

0
Azizou