web-dev-qa-db-fra.com

trop d'initialiseurs pour 'int [0]' c ++

Première:

int k[] ={1,2,3,4,5};

Seconde:

struct slk
{
    int k[] ={1,2,3,4,5};
};

pour ces deux déclarations, pourquoi la première passe-t-elle la compilation mais la seconde me donne

erreur: trop d'initialiseurs pour 'int [0]'. la compilation passerait si je mettais k [5];

Que signifie ce message d'erreur? Remarque: code testé sur GNU GCC version 4.7.2

24
cppython

En C++ 11, les initialiseurs de membre en classe sont autorisés, mais agissent essentiellement de la même manière que l'initialisation dans une liste d'initialisation de membre. Par conséquent, la taille du tableau doit être explicitement indiquée.

Stroustrup a une courte explication sur son site Web ici .

Le message d'erreur signifie que vous fournissez trop d'éléments pour un tableau de longueur 0, ce qui est int [] est évalué dans ce contexte.

30
jtomschroeder

Dans le premier exemple, quelque chose (allocation de mémoire réelle) se produit réellement. L'ordinateur compte facilement le nombre d'éléments qui lui sont attribués et l'utilise comme capacité. Dans la deuxième utilisation, dans le cadre d'une structure, le tableau fait simplement partie du modèle d'une structure. Dans le second cas, une taille doit être explicitement indiquée et connue au moment de la compilation. Il n'y a pas de comptage automatique ici. C'est dans la même veine que les déclarations de fonctions par rapport aux définitions ainsi que les déclarations de variables (indique le type mais la mémoire est intacte) et leur invocation/utilisation (où le programme agit).

3
Chris Zhang

Probablement parce que dans un struct le compilateur a besoin de vous pour spécifier la taille explicitement.

C initialise le tableau dans la structure (jeu de mots voulu)

2
Dannie

Ce sont deux contextes complètement différents:

La première est une déclaration de variable (avec une clause initialiser).

Le second est une définition de type.

1
user3200739