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.
c++
c
compiler-construction
Namratha Patil
la source
la source
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:
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 source
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.
la source
Si votre compilateur est GCC, vous pouvez également utiliser la syntaxe suivante:
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 .
la source
Cela dépend de l'endroit où vous placez cette initialisation.
Si le tableau est statique comme dans
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.
Dans ce cas, à chaque appel de la fonction foo, vous aurez un memset caché.
Le code ci-dessus équivaut à
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
alors c'est techniquement le même cas que le premier.
la source