En C, il existe plusieurs façons d'initialiser des structures :
struct Point { int x, y; }; struct Point p = {10, 20};
Les champs sont initialisés dans l'ordre déclaré.
struct Point p = {.y = 20, .x = 10};
On peut initialiser les champs dans n'importe quel ordre.
struct Rect { int x, y, w, h; } r = {1, 2}; // w et h == 0
struct Color { int r, g, b; }; struct Pixel { struct Point pos; struct Color col; }; struct Pixel px = {{10,20}, {255,0,0}};
L'initialisation nommée peut aider à éviter des erreurs :
struct Pixel px = {.col = {.r = 255, .g = 0, .b = 0}};
Écueils :
Question : Que se passe-t-il si, lors de l'initialisation d'une structure, tous les champs ne sont pas explicitement spécifiés et que la structure est déclarée comme une variable locale automatique ?
Réponse attendue incorrecte : "Les champs restants seront toujours égaux à zéro."
Réponse correcte : Les variables automatiques (locales), non initialisées explicitement, restent avec des valeurs non initialisées. L'initialisation partielle n'initialise que les champs explicitement indiqués, les autres ayant une valeur indéfinie (exceptions pour les initialisations via = {...}, où les autres seront nuls uniquement pour les structures statiques/globale).
Exemple :
void foo() { struct Point { int x, y, z; } p = {1}; // p.x == 1, p.y et p.z == 0 (Seulement à travers = {1};) }
Histoire
Dans un projet de moteur graphique, un champ a été ajouté au début de la structure de sommet, sans réexaminer le mode d'initialisation global des objets dans différents modules. En conséquence, la moitié des modules a commencé à initialiser incorrectement la couleur ou les coordonnées, ce qui s'est manifesté sous forme d'artefacts d'affichage.
Histoire
Dans le gestionnaire vidéo, une structure avec des pointeurs imbriqués a été partiellement initialisée = {0}, ce qui est correct pour les variables globales mais pas pour les locales. En résumé, les pointeurs contenaient "des ordures", ce qui a conduit à un travail avec des adresses non valides et des plantages difficiles à détecter.
Histoire
Lors de l'ajout de nouveaux champs dans une grande structure, les auteurs n'ont pas mis à jour les anciennes sections de code avec une initialisation ordinaire. En raison des incohérences entre l'ordre des champs et les initialisateurs, des variables critiques ont commencé à recevoir des valeurs incorrectes. Seule une révision de la structure et l'adoption d'une initialisation nommée ont permis de trouver la cause.