valeur initiale de tableau int en C
Lors de la déclaration d'un tableau en C comme ceci:
int array[10];
Quelle est la valeur initiale des entiers?? J'obtiens des résultats différents avec différents compilateurs et je veux savoir si il a quelque chose à voir avec le compilateur, ou de l'OS.
Vous devez vous connecter pour publier un commentaire.
Si le tableau est déclarée dans une fonction, la valeur est undefined.
int x[10];
dans une fonction signifie: prendre la possession de 10-int-taille de la zone de memroy, sans faire d'initialisation. Si le tableau est déclaré comme un global ou commestatic
dans une fonction, puis tous les éléments sont initialisés à zéro si elles ne sont pas initialisées déjà.int array[10] = {0};
. Obtenir le compilateur de le faire automatiquement, il signifie simplement que vous êtes à l'écriture de code qui ne fonctionne qu'en mode debug, et des pauses lorsque vous la relâchez, ou quelqu'un d'autre compile avec différentes options.static
variable définie à l'intérieur d'une fonction peut aussi être initialisé avec des zéros.Comme défini par la norme, tous les mondiales et de la fonction de variables statiques automatiquement initialisées à 0. Automatique de variables ne sont pas initialisées.
Cependant c'est une bonne pratique de toujours manuellement initialiser la variable de fonction, indépendamment de sa classe de stockage. Pour définir tous les éléments du tableau à 0, vous avez juste besoin d'attribuer premier élément de tableau 0 - éléments omis sera mis à 0 automatiquement:
Pourquoi la fonction habitants (
auto
classe de stockage) n'est pas initialisé quand tout le reste est?C est proche du matériel; c'est sa plus grande force et sa plus grand danger. La raison
auto
classe de stockage des objets aléatoires valeurs initiales est parce qu'ils sont allouées sur la pile, et une décision a été prise de ne pas effacer automatiquement ces (en partie parce qu'ils auraient besoin d'être effacé à chaque appel de fonction).D'autre part, la non-
auto
les objets n'ont plus à être effacé une fois que. De Plus, le système d'exploitation pour effacer les pages allouées pour des raisons de sécurité, de toute façon. De sorte que la conception de décision était ici pour spécifier zéro de l'initialisation. Pourquoi n'est-ce pas de la sécurité d'un problème avec la pile, trop? En fait, il est effacé, au premier abord. La jonque que vous voyez est des plus anciennes formes de votre propre programme à l'appel de cadres et le code de la bibliothèque, ils ont appelé.Le résultat de fin est rapide, efficace de la mémoire de code. Tous les avantages de l'assemblée, sans aucune douleur. Avant dmr inventé C, "HLL"s comme Base et l'ensemble de l'OS grains ont été vraiment, littéralement, mis en œuvre en tant que géant des programmes en assembleur. (Avec certaines exceptions dans des endroits comme IBM).
Selon la norme C, 6.7.8 (note 10):
Donc ça dépend du compilateur. Avec MSVC, les versions de débogage permet d'initialiser variables automatiques avec 0xcc, tandis que les non-debug ne sera pas initialiser ces variables au tout.
Un C déclaration de variable indique au compilateur de mettre de côté et le nom d'une zone de la mémoire pour vous. Pour les variables automatiques, aussi connu comme la pile des variables, les valeurs en mémoire ne sont pas modifiés à partir de ce qu'ils étaient avant. Mondial et les variables statiques sont mis à zéro lorsque le programme démarre.
Certains compilateurs dans unoptimized debug mode automatique de variables à zéro. Cependant, il est devenu commun dans les nouveaux compilateurs pour définir les valeurs d'une mauvaise connaissance de la valeur de sorte que le programmeur n'est pas sans le savoir écrire du code qui dépend d'un zéro à définir.
Afin de demander au compilateur de définir un tableau à zéro pour vous, vous pouvez l'écrire comme:
Mieux encore est de définir le tableau avec les valeurs qu'elle doit avoir. Qui est plus efficace et évite d'écrire dans le tableau à deux fois.
Dans la plupart des compilateurs dernières(par exemple. gcc/vc++), partiellement initialisé local array/membres de structure par défaut sont initialisées à zéro(int), NUL(char/char string), 0.000000(float/double).
En dehors du local de tableau ou de la structure de données comme ci-dessus, statique(global/local) et global de l'espace membres sont également maintenir la même propriété.
Dans gcc/vc++, la sortie doit être:
0 2 0
1 0 0 0.000000
s11.c est nul
s11.str est null
Texte de http://www.cplusplus.com/doc/tutorial/arrays/
Les sections pertinentes de la norme C (l'emphase est mienne):