valeur initiale de int tableau en C

En déclarant un tableau dans 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 cela a quelque chose à voir avec le compilateur ou le système d’exploitation.

Si le tableau est déclaré dans une fonction, la valeur est indéfinie. int x[10]; dans une fonction signifie: prendre la propriété de la zone de 10-int-taille de memroy sans faire d’initialisation. Si le tableau est déclaré comme global ou static dans une fonction, tous les éléments sont initialisés à zéro s’ils ne sont pas déjà initialisés.

Comme défini par la norme, toutes les variables statiques globales et fonctionnelles sont automatiquement initialisées à 0. Les variables automatiques ne sont pas initialisées.

 int a[10]; // global - all elements are initialised to 0 void foo(void) { int b[10]; // automatic storage - contain junk static int c[10]; // static - initialised to 0 } 

Cependant, il est recommandé de toujours initialiser manuellement la variable de fonction, quelle que soit sa classe de stockage. Pour définir tous les éléments du tableau sur 0, il vous suffit d’affecter le premier élément du tableau à 0 – les éléments omis seront automatiquement définis sur 0:

 int b[10] = {0}; 

Pourquoi les fonctions locales (classe de stockage auto ) ne sont-elles pas initialisées lorsque tout le rest est?

C est proche du matériel; c’est sa plus grande force et son plus grand danger. La raison pour laquelle les objects de la classe de stockage auto ont des valeurs initiales aléatoires est qu’ils sont alloués sur la stack et qu’une décision de conception a été prise pour ne pas les supprimer automatiquement (en partie parce qu’ils devraient être effacés à chaque appel de fonction).

Par contre, les objects non auto ne doivent être effacés qu’une seule fois. De plus, le système d’exploitation doit effacer les pages allouées pour des raisons de sécurité. La décision de conception était donc de spécifier une initialisation nulle. Pourquoi la sécurité n’est-elle pas également un problème avec la stack? En fait, il est effacé, au début. Le courrier indésirable que vous voyez provient d’instances antérieures des trames d’appel de votre propre programme et du code de bibliothèque qu’elles ont appelé.

Le résultat final est un code rapide et efficace en mémoire. Tous les avantages de l’assemblage sans la douleur. Avant que Drr invente le C, les “HLL” comme Basic et les kernelx entiers du système d’exploitation étaient littéralement implémentés en tant que programmes d’assembleur géants. (Avec certaines exceptions à des endroits comme IBM.)

Selon la norme C, 6.7.8 (note 10):

Si un object qui a une durée de stockage automatique n’est pas initialisé explicitement, sa valeur est indéterminée.

Donc, cela dépend du compilateur. Avec MSVC, les versions de débogage initialisent les variables automatiques avec 0xcc, alors que les versions sans débogage n’initialisent pas du tout ces variables.

Dans la plupart des derniers compilateurs (par exemple, gcc / vc ++), les membres de la structure / du tableau local partiellement initialisés sont initialisés par défaut à zéro (int), NULL (chaîne char / char), 0.000000 (float / double).

Outre les données de structure / tableau locales comme ci-dessus, les membres static (global / local) et global space conservent également la même propriété.

 int a[5] = {0,1,2}; printf("%d %d %d\n",*a, *(a+2), *(a+4)); struct s1 { int i1; int i2; int i3; char c; char str[5]; }; struct s1 s11 = {1}; printf("%d %d %d %c %s\n",s11.i1,s11.i2, s11.i3, s11.c, s11.str); if(!s11.c) printf("s11.c is null\n"); if(!*(s11.str)) printf("s11.str is null\n"); 

Dans gcc / vc ++, la sortie doit être:

0 2 0 1 0 0 0.000000 s11.c est nul s11.str est nul

La déclaration de variable AC indique simplement au compilateur de mettre de côté et de nommer une zone de mémoire pour vous. Pour les variables automatiques, également appelées variables de stack, les valeurs de cette mémoire ne sont pas modifiées par rapport à ce qu’elles étaient auparavant. Les variables globales et statiques sont définies sur zéro lorsque le programme démarre.

Certains compilateurs en mode de débogage non optimisé définissent des variables automatiques à zéro. Cependant, il est devenu courant dans les nouveaux compilateurs de définir les valeurs sur une valeur erronée, de sorte que le programmeur n’écrit pas sans le savoir un code qui dépend d’un zéro défini.

Pour demander au compilateur de définir un tableau à zéro pour vous, vous pouvez l’écrire comme suit:

 int array[10] = {0}; 

Mieux encore, il faut définir le tableau avec les valeurs qu’il devrait avoir. Cela est plus efficace et évite d’écrire deux fois dans le tableau.

Texte de http://www.cplusplus.com/doc/tutorial/arrays/

RÉSUMÉ:

Initialisation des tableaux. Lorsque vous déclarez un tableau régulier de scope locale (dans une fonction, par exemple), si nous ne spécifions pas autrement, ses éléments ne seront initialisés à aucune valeur par défaut, leur contenu sera donc indéterminé jusqu’à ce que nous en conservions une valeur. Les éléments des tableaux globaux et statiques, quant à eux, sont automatiquement initialisés avec leurs valeurs par défaut, ce qui signifie qu’ils sont remplis de zéros pour tous les types fondamentaux.

Dans les deux cas, local et global, lorsque nous déclarons un tableau, nous avons la possibilité d’atsortingbuer des valeurs initiales à chacun de ses éléments en plaçant les valeurs entre accolades {}. Par exemple:

 int billy [5] = { 16, 2, 77, 40, 12071 };