web-dev-qa-db-fra.com

Comment le tableau [100] = {0} définit-il le tableau entier à 0?

Comment le compilateur remplit-il les valeurs dans char array[100] = {0};? Quelle est la magie derrière tout ça?

Je voulais savoir comment le compilateur s'initialise en interne.

140
mahesh

Ce n'est pas magique.

Le comportement de ce code en C est décrit à la section 6.7.8.21 de la spécification C ( brouillon en ligne de la spécification C ): pour les éléments qui n'ont pas de valeur spécifiée, le compilateur initialise les pointeurs sur NULL et types arithmétiques à zéro (et applique cela récursivement aux agrégats).

Le comportement de ce code en C++ est décrit dans la section 8.5.1.7 de la spécification C++ ( brouillon en ligne de la spécification C++ ): le compilateur initialise les éléments qui n'ont pas de valeur spécifiée.

Notez également qu'en C++ (mais pas C), vous pouvez utiliser une liste d'initialiseur vide, ce qui amène le compilateur à initialiser de manière agrégée tous les éléments du tableau:

char array[100] = {};

En ce qui concerne le type de code que le compilateur peut générer lorsque vous faites cela, jetez un oeil à cette question: Strange Assembly à partir du tableau 0-initialisation

161
bk1e

L'implémentation est faite par les développeurs du compilateur.

Si votre question est "que se passera-t-il avec une telle déclaration" - le compilateur définira le premier élément de tableau sur la valeur que vous avez fournie (0) et tous les autres sur 0, car il s'agit d'une valeur par défaut pour les éléments de tableau omis.

35
qrdl

Si votre compilateur est GCC, vous pouvez également utiliser la syntaxe suivante:

int array[256] = {[0 ... 255] = 0};

Veuillez regarder http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits , et notez qu'il s'agit d'un caractéristique du compilateur .

27
lakshmanaraj

Cela dépend où vous mettez cette initialisation.

Si le tableau est statique comme dans

char array[100] = {0};

int main(void)
{
...
}

c'est alors le compilateur qui réserve les 100 0 octets dans le segment de données du programme. Dans ce cas, vous auriez pu omettre l'initialiseur.

Si votre tableau est auto, alors c'est une autre histoire.

int foo(void)
{
char array[100] = {0};
...
}

Dans ce cas, vous aurez un memset caché à chaque appel de la fonction foo.

Le code ci-dessus est équivalent à

int foo(void)
{ 
char array[100];

memset(array, 0, sizeof(array));
....
}

et si vous omettez l'initialiseur, votre tableau contiendra des données aléatoires (les données de la pile).

Si votre tableau local est déclaré statique comme dans

int foo(void)
{ 
static char array[100] = {0};
...
}

alors, techniquement, c'est le même cas que le premier.

17
gallier2