web-dev-qa-db-fra.com

L'initialisation des variables statiques en C

J'ai une question sur l'initialisation des variables statiques en C. Je sais que si nous déclarons une variable statique globale que par défaut la valeur est 0. Par exemple:

static int a; //although we do not initialize it, the value of a is 0

mais qu'en est-il de la structure de données suivante:

typedef struct
{
    int a;
    int b;
    int c;
} Hello;

static Hello hello[3];

sont tous les membres de chaque structure de hello[0], hello[1], hello[2] initialisé comme 0?

36
user707549

Oui, tous les membres sont initialisés pour les objets avec stockage statique. Voir 6.7.8/10 dans le Norme C99 (document PDF)

Si un objet qui a une durée de stockage automatique n'est pas initialisé explicitement, sa valeur est indéterminée. Si un objet qui a une durée de stockage statique n'est pas initialisé explicitement , alors:
- s'il a un type de pointeur, il est initialisé à un pointeur nul;
- s'il a un type arithmétique, il est initialisé à zéro (positif ou non signé);
- s'il s'agit d'un agrégat, chaque membre est initialisé (récursivement) selon ces règles;
- s'il s'agit d'une union, le premier membre nommé est initialisé (récursivement) selon ces règles.

Pour tout initialiser dans un objet, que ce soit static ou non, à 0, j'aime utiliser le initialiseur universel zéro

sometype identifier0 = {0};
someothertype identifier1[SOMESIZE] = {0};
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0};

Il n'y a pas initialisation partielle en C. Un objet est soit complètement initialisé (à 0 du bon type en l'absence d'une valeur différente) ou pas du tout initialisé.
Si vous voulez une initialisation partielle, vous ne pouvez pas initialiser pour commencer.

int a[2]; // uninitialized
int b[2] = {42}; // b[0] == 42; b[1] == 0;
a[0] = -1; // reading a[1] invokes UB
50
pmg

Oui, tant qu'ils ont une durée de stockage statique ou de thread.

C11 (n1570), § 6.7.9 Initialisation # 1

Si un objet qui a une durée de stockage statique ou de thread n'est pas initialisé explicitement, alors:

[...]

  • s'il a un type arithmétique, il est initialisé à zéro (positif ou non signé);
  • s'il s'agit d'un agrégat, chaque membre est initialisé (récursivement) conformément à ces règles, et tout remplissage est initialisé à zéro bit;

[...]

2
md5

Oui, les variables statiques de portée de fichier sont initialisées à zéro, y compris tous les membres des structures, des tableaux, etc.

Voir cette question pour référence (je voterai également pour la fermer en double).


Edit: cette question obtient de bien meilleures réponses, donc je vote pour fermer cette question en double de ceci , à la place.

Pour référence, voici le C FAQ lien de la réponse acceptée à cette question, bien que bien sûr les normes C99 et C11 liées ici soient canoniques.

2
Useless

J'ajouterais que les variables statiques (ou tableaux) sont classées en deux types.

Initialisés sont ceux qui reçoivent une valeur du code au moment de la compilation. Ceux-ci sont généralement stockés dans DS bien que cela soit spécifique au compilateur.

L'autre type est les statiques non initialisées qui sont initialisées au moment de l'exécution et sont stockées dans le segment BSS bien que là encore, cela soit spécifique au compilateur.

BSS

1
fayyazkl