Quelle valeur les champs int dans struct ne sont-ils pas encore initialisés?

Dans le code: …

#define MAXELEMNTS 100 struct book { int number; char name[31]; char author[31]; int year; char publisher[31]; }; struct book bkStruct[MAXELEMENTS]; 

Les champs de nombre entier (nombre et année) sont-ils initialisés à 0 par défaut lorsque les autres champs de caractère sont initialisés mais pas ces deux? Ou ont-ils Dieu-sait-quelle valeur? D’après mon expérience, ils ont une valeur = 0, mais je ne suis pas sûr que cette règle générale soit, donc je dois en être sûr!

Cordialement, Papo

En C, “l’initialisation partielle” n’existe pas. Si une structure est initialisée en spécifiant une valeur pour un seul membre, tous les autres membres sont automatiquement initialisés (à 0 du type approprié).

 struct book { int number; char name[31]; char author[31]; int year; char publisher[31]; }; struct book book1; // no initialization struct book book2 = { .author = "pmg" }; // initialization of ALL of book2 struct book bkStruct1[MAXELEMENTS]; // uninitialized array struct book bkStruct2[MAXELEMENTS] = {0}; // initialized array // (every member of every element) 

Remarque: certaines implémentations peuvent se plaindre de l’absence d’accolades lors de l’initialisation parfaitement légale du tableau. C’est un problème avec ces implémentations.

Si vous définissez un object avec un initialiseur, il est initialisé à la valeur spécifiée. Si vous spécifiez uniquement des valeurs pour certains membres, les autres sont initialisés à zéro (ce qui signifie 0 pour les entiers (y compris les caractères), 0.0 pour les valeurs à virgule flottante et NULL pour les pointeurs).

Si vous définissez un object sans initialiseur, tous les membres sont implicitement initialisés à zéro si l’object a une durée de stockage statique, c’est-à-dire s’il est défini en dehors de toute fonction ou s’il est défini avec le mot clé static .

Un object défini dans une fonction sans le mot-clé static a une durée de stockage automatique . De tels objects, s’ils ne sont pas explicitement initialisés, commencent par des valeurs parasites. (Si vous voyez de tels objects apparemment initialisés à zéro, rappelez-vous que zéro peut être une valeur identique à une valeur quelconque).

Tu as demandé:

Les champs de nombre entier (nombre et année) sont-ils initialisés à 0 par défaut lorsque les autres champs de caractère sont initialisés mais pas ces deux?

mais le code de votre question n’initialise pas les champs char[] . Voir la réponse de pmg , qui montre quelques bons exemples, mais ne mentionne pas actuellement la distinction static / automatique.

pour être sûr, vous devez initialiser vos varibales à 0 vous-même en fonction du compilateur;