Maison >développement back-end >C++ >L'initialisation partielle des structures et des tableaux automatiques en C et C est-elle autorisée et définie ?

L'initialisation partielle des structures et des tableaux automatiques en C et C est-elle autorisée et définie ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-11 08:49:10958parcourir

Is Partial Initialization of Automatic Structures and Arrays in C and C   Allowed and Defined?

Initialisation partielle des structures et tableaux automatiques en C et C

L'idée fausse découle de l'hypothèse erronée selon laquelle l'initialisation partielle des structures et tableaux automatiques est autorisé en C. Contrairement à cette croyance, les standards ne définissent explicitement que deux cas : initialisation complète ou pas d'initialisation. initialisation.

Initialisation partielle

Le terme « initialisation partielle » n'est pas défini dans les normes. Il fait référence à l'initialisation d'un seul sous-ensemble de membres dans une structure ou un tableau.

Initialisation complète

L'initialisation complète se produit lorsque tous les membres d'une structure ou d'un tableau sont explicitement initialisés. Par exemple :

struct somestruct {
  int a;
  int b;
  int c;
};

somestruct s = {1, 2, 3};

Aucune initialisation

Lorsqu'aucune initialisation n'est fournie, le comportement dépend du type de stockage de la variable :

  • Pour les variables automatiques (sur la pile), il n'est pas garanti que les membres non initialisés soient initialisés. Leurs valeurs sont indéterminées.
  • Pour les variables statiques (avec une portée globale ou fichier), les membres non initialisés sont initialisés à 0 pour les types intégraux et à NULL pour les membres pointeurs.

Partiel Initialisation en pratique

Bien qu'il ne s'agisse pas d'un comportement standard, l'initialisation partielle de la structure automatique et des membres du tableau est prise en charge par la plupart compilateurs, notamment Visual Studio et gcc/g .

Standard C (C99)

Section 6.7.8.21 Initialisation

Si moins d'initialiseurs sont fournis que le nombre d'éléments ou de membres dans un agrégat, les éléments restants sont initialisés à 0.

Standard C (C 03)

Section 8.5.1 Agrégats

Si moins d'initialiseurs sont présents, le les membres non initialisés sont initialisés par valeur. L'initialisation de la valeur diffère en fonction du type d'objet. Par exemple, les données membres non statiques d'un type de classe non-union sont initialisées par valeur, tandis que les types primitifs comme les entiers sont initialisés à zéro.

Conclusion

Partielle l'initialisation de structures et de tableaux automatiques est un comportement non standard qui peut conduire à des résultats indéfinis s'il n'est pas géré correctement. Pour garantir la portabilité et l'exactitude, assurez-vous toujours d'une initialisation complète ou d'aucune initialisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn