web-dev-qa-db-fra.com

Initialiser une structure à 0

Si j'ai une structure comme celle-ci:

typedef struct
{
    unsigned char c1;
    unsigned char c2;
} myStruct;

Quel serait le moyen le plus simple d'initialiser cette structure à 0? Ce qui suit suffirait-il?

myStruct _m1 = {0};

ou aurais-je besoin d'initier explicitement chaque membre à 0?

myStruct _m2 = {0,0};
99
Daan Timmer

La première est la plus facile ( implique moins de dactylographie ), et son fonctionnement est garanti, tous les membres seront réglés sur 0[Ref 1].
La seconde est plus lisible.

Le choix dépend des préférences de l'utilisateur ou de celui que votre norme de codage impose.

[Ref 1]  Référence C99 Standard 6.7.8.21:

Si la liste entourée d'accolades contient moins d'initialiseurs que d'éléments ou de membres d'un agrégat, ou moins de caractères dans un littéral de chaîne utilisé pour initialiser un tableau de taille connue par rapport au nombre d'éléments contenus dans le tableau, le reste de l'agrégat doit être initialisé implicitement de la même façon que les objets ayant une durée de stockage statique.

Bonne lecture:
C et C++: initialisation partielle de la structure automatique

124
Alok Save

Si les données sont des variables statiques ou globales, elles sont remplies de zéros par défaut. Déclarez-les simplement myStruct _m;

Si les données sont une variable locale ou une zone allouée au tas, effacez-la avec memset comme:

memset(&m, 0, sizeof(myStruct));

Les compilateurs actuels (par exemple, les versions récentes de gcc) l’optimisent assez bien dans la pratique. Cela ne fonctionne que si toutes les valeurs nulles (y compris les pointeurs nuls et le zéro à virgule flottante) sont représentées par tous les bits nuls, ce qui est vrai sur toutes les plates-formes que je connais (mais la norme C autorise les implémentations où cela est faux, je ne connais pas une telle implémentation).

Vous pourriez peut-être coder myStruct m = {}; ou myStruct m = {0}; (même si le premier membre de myStruct n'est pas un scalaire).

Mon sentiment est que l’utilisation de memset pour les structures locales est la meilleure solution, car elle traduit mieux le fait qu’au moment de l’exécution, il faut faire quelque chose (alors qu’en général, les données globales et statiques peuvent être comprises comme initialisées au moment de la compilation, sans tout coût à l'exécution).

28

Voir §6.7.9 Initialisation:

21 Si la liste entourée d'accolades contient moins d'initialiseurs que d'éléments ou de membres d'un agrégat, ou moins de caractères dans un littéral de chaîne utilisé pour initialiser un tableau de taille connue par rapport au nombre d'éléments contenus dans le tableau, le reste de l'agrégat doit être initialisé implicitement de la même manière que les objets ayant une durée de stockage statique.

Donc, oui, ils travaillent tous les deux. Notez qu'en C99, une nouvelle méthode d'initialisation, appelée initialisation désignée, peut également être utilisée:

myStruct _m1 = {.c2 = 0, .c1 = 1};
17
dirkgently