L'initialisation d'une structure à 0
Si j'ai une structure comme ceci:
typedef struct
{
unsigned char c1;
unsigned char c2;
} myStruct;
Quelle serait la façon la plus simple pour initialiser cette structure à 0?
L'exemple suivant suffira?
myStruct _m1 = {0};
ou aurais-je besoin explicitement init chaque membre de 0?
myStruct _m2 = {0,0};
Vous devez vous connecter pour publier un commentaire.
La première est la plus simple(implique moins de frappe), et il est garanti pour fonctionner, tous les membres seront mis à
0
[Ref 1].La deuxième est plus lisible.
Le choix dépend des préférences de l'utilisateur ou de celui qui votre norme de codage des mandats.
[Ref 1] de Référence Standard C99 6.7.8.21:
Bonne Lecture:
C et C++ : Partielle de l'initialisation automatique de la structure
= {};
Cependant, je ne sais pas si c'est valable.char *
(par exemple)?_m2
exemple moins de sens si il n'y avait plus de membres, et devrait être mis à jour si le nombre de membres a diminué.#define ZERO_FULL {0}
ou#define ZERO_ALL {0}
foo = {0}
moyens. Si je l'ai vufoo = ZERO_FULL
, j'aurais du grep pour la définition de ZERO_FULL.objects that have static storage duration
sont initialisées à zéro. Par conséquent, tous les membres d'une structure ne sont pas mentionnés dans un corset-ci-joint la liste sont automatiquement initialisées à zéro."Si les données sont un statique ou variable globale, c'est zéro-rempli par défaut, il suffit donc de le déclarer
myStruct _m;
Si la donnée est une variable locale ou un segment de mémoire allouée zone, clair avec
memset
comme:Compilateurs gcc (par exemple, les versions récentes de
gcc
) d'optimiser très bien dans la pratique. Cela ne fonctionne que si toutes les valeurs nulles (inclure les pointeurs nuls et zéro virgule flottante) sont représentés comme tous les zéro bits, ce qui est vrai sur toutes les plateformes-je savoir à propos (mais la C norme permet des implémentations où cela est faux; je ne connais pas d'exemple de mise en œuvre).Vous pourriez peut-code
myStruct m = {};
oumyStruct m = {0};
(même si le premier membre demyStruct
n'est pas un scalaire).Mon sentiment est que l'utilisation de
memset
pour les structures locales est la meilleure, et elle donne mieux le fait que lors de l'exécution, quelque chose doit être fait (alors que généralement, les données globales et statiques peuvent être compris comme des initialisé au moment de la compilation, sans aucun coût à l'exécution).0
sera équivalent à l'initialisation de tous les membres de la structure avec0
bien. Sur de nombreuses plates-formes, ce sera vrai, mais pas la totalité.{}
n'est pas valide en C, mais uniquement disponible en C++.NULL
pointeur qui n'était pas tout0
bits : c-faq.com/null/machexamp.html. Et puis il y a la possibilité de la plate-forme n'est pas en utilisant la norme IEEE 754 pour représenter les valeurs à virgule flottante, mais utilise une autre représentation qui n'ont pas de tous les0
peu0.0
valeur - mais il est vrai que je ne connais pas une telle plate-forme.= {0}
comme recommandé par les principaux réponse ne fonctionne pas, de sorte que vous doit utiliser lememset()
technique vous montrer ici. L'erreur j'ai essayer le= {0}
technique pour mon struct qui contient des sous-matrices de a:error: suggest braces around initialization of subobject [-Werror,-Wmissing-braces]
Voir §6.7.9 Initialisation:
Donc, oui tous les deux travaillent. Notez qu'en C99 une nouvelle façon d'initialisation, désignés initialisation peut être utilisé aussi: