Comment le compilateur remplit-il les valeurs dans char array[100] = {0};
? Quelle est la magie derrière ça?
Je voulais savoir comment le compilateur s'initialise en interne.
Comment le compilateur remplit-il les valeurs dans char array[100] = {0};
? Quelle est la magie derrière ça?
Je voulais savoir comment le compilateur s'initialise en interne.
Réponses:
Ce n'est pas magique.
Le comportement de ce code en C est décrit dans la section 6.7.8.21 de la spécification C ( ébauche 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 à NULL et les types arithmétiques à zéro ( et l'applique 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 ++ ( ébauche en ligne de la spécification C ++ ): le compilateur agrège-initialise les éléments qui n'ont pas de valeur spécifiée.
Notez également qu'en C ++ (mais pas en C), vous pouvez utiliser une liste d'initialisation vide, ce qui oblige le compilateur à agréger-initialiser 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 œil à cette question: Assemblage étrange du tableau 0-initialisation
La mise en œuvre appartient aux développeurs du compilateur.
Si votre question est "ce qui se passera avec une telle déclaration" - le compilateur définira le premier élément du tableau sur la valeur que vous avez fournie (0) et tous les autres seront mis à zéro car c'est une valeur par défaut pour les éléments du tableau omis.
Si votre compilateur est GCC, vous pouvez également utiliser la syntaxe suivante:
int array[256] = {[0 ... 255] = 0};
Veuillez consulter http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits , et notez qu'il s'agit d'une fonctionnalité spécifique au compilateur .
Cela dépend de l'endroit où vous placez cette initialisation.
Si le tableau est statique comme dans
char array[100] = {0};
int main(void)
{
...
}
alors c'est le compilateur qui réserve les 100 0 octets dans le segment de données du programme. Dans ce cas, vous pourriez avoir omis l'initialiseur.
Si votre baie est automatique, c'est une autre histoire.
int foo(void)
{
char array[100] = {0};
...
}
Dans ce cas, à chaque appel de la fonction foo, vous aurez un memset caché.
Le code ci-dessus équivaut à
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 c'est techniquement le même cas que le premier.