261 votes

Que signifie {0} dans C ?

Lorsque {0} est utilisé pour initialiser un objet en C/C++, ce que cela signifie ? Je ne peux pas trouver toutes les références à {0} n’importe où, et à cause des accolades les recherches Google ne sont pas utiles.

Exemple de code :

Sans elle, le code ci-dessus va se planter sur la duree...

Merci.

313voto

Don Neufeld Points 12803

Ce qui se passe ici est appelé agrégat d'initialisation. Voici la (nom abrégé) définition d'un agrégat à partir de la section 8.5.1 de l'ISO spec:

Un agrégat est un tableau ou une classe sans que l'utilisateur n'-a déclaré constructeurs, sans privés ou protégés non-membres de données statiques, pas de classes de base, et pas de fonctions virtuelles.

Maintenant, à l'aide de {0} pour initialiser un agrégat comme c'est un truc à 0 l'ensemble de la chose. C'est parce que lors de l'utilisation globale de l'initialisation , vous n'avez pas à spécifier tous les membres et la spécification exige que tous les non spécifié membres être initialisé par défaut, ce qui signifie que définie à 0 pour les types simples.

Voici la citation de la spécification:

Si il y a moins d'initialiseurs dans la liste qu'il y a de membres dans le d'agrégation, puis chaque membre explicitement initialisée est par défaut-initialisé. Exemple:

struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };

initialise ss.une avec 1, ss.b avec "asdf", et ss.c avec la valeur d'un expression de la forme int(), qui est, 0.

Vous pouvez trouver l'complet spec sur ce sujet ici:

http://www.kuzbass.ru:8086/docs/isocpp/decl.html#dcl.init.aggr

93voto

Harold Ekstrom Points 1214

Une chose à connaître est que cette technique n’est pas affectée octets de remplissage à zéro. Par exemple :

Est-ce pas la même chose que :

Dans le premier cas, le pad octets entre c et moi sommes non initialisé. Pourquoi cela vous intéresse-t-il ? Eh bien, si vous enregistrez ces données de disque ou de l’envoyer sur un réseau ou que ce soit, vous pourriez avoir un problème de sécurité.

21voto

dalle Points 9083

Notez qu’un initialiseur d’agrégation vide fonctionne également :

11voto

snowcrash09 Points 2024

En réponse à pourquoi ShellExecuteEx() plante: votre SHELLEXECUTEINFO "sexi" struct a beaucoup de membres et vous êtes seulement à l'initialisation de certains d'entre eux.

Par exemple, le membre sexi.lpDirectory peut pointer n'importe où, mais ShellExecuteEx() sera toujours essayer de l'utiliser, d'où vous aurez une violation d'accès mémoire.

Lorsque vous incluez la ligne:

SHELLEXECUTEINFO sexi = {0};

avant que le reste de votre configuration de la structure, vous avez dit le compilateur à zéro tous les membres de structure avant d'initialiser des spécifiques qui vous intéressent. ShellExecuteEx() sait que si sexi.lpDirectory est égale à zéro, il doit l'ignorer.

7voto

Adam Pierce Points 12801

Je l'utilise aussi pour initialiser des chaînes par exemple.

 char mytext[100] = {0};
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X