Erreur: un object de taille variable peut ne pas être initialisé

#define L 1 #define M L+1 int main(void){ int N=L*M*2; char s [N]={'1','2'}; printf("%d", sizeof(s)); return 1; } 

Pourquoi le code ci-dessus ne peut pas être compilé? Le compilateur d’Eclipse dit deux choses:

  1. Un object de taille variable peut ne pas être initialisé: est-ce parce que la définition de N avec M et L est au niveau de la macro ou est-ce parce que je ne peux pas initialiser un tableau avec le type arr [x] où x est variable dans toutes les circonstances?
  2. éléments en excès dans l’initialiseur de tableau – Qu’est-ce que cela signifie?

parce que je ne peux pas initialiser un tableau avec le type arr [x] où x est variable?

En effet, avant la version C99, la taille du tableau devait être une expression constante . En C99, cela a été assoupli avec des tableaux de longueur variable .

(Cela n’a rien à voir avec les macros.)

éléments en excès dans l’initialiseur de tableau – Qu’est-ce que cela signifie?

Corrigez le premier problème et cela devrait disparaître.

La taille du tableau dans votre exemple est spécifiée par N , qui n’est pas une constante. Cela signifie que votre tableau est VLA (tableau de longueur variable). Le langage C n’autorise pas les initialiseurs dans les déclarations VLA.

Pour que cela soit compilé, N doit me transformer en constante (puisque M et L sont des constantes, N peut aussi être une constante). Déclarez N utilisant #define ou en tant que membre enum.

Si je me souviens bien,

 char s [N]={'1','2'}; 

N doit être une constante