In C ci sono diversi modi per inizializzare le strutture:
struct Point { int x, y; }; struct Point p = {10, 20};
I campi vengono inizializzati nell'ordine dichiarato.
struct Point p = {.y = 20, .x = 10};
È possibile inizializzare i campi in qualsiasi ordine.
struct Rect { int x, y, w, h; } r = {1, 2}; // w e 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'inizializzazione nominata può aiutare a evitare errori:
struct Pixel px = {.col = {.r = 255, .g = 0, .b = 0}};
Insidie:
Domanda: Cosa succede se, durante l'inizializzazione di una struttura, non vengono specificati esplicitamente tutti i campi, e la struttura è dichiarata come variabile locale automatica?
Risposta attesa errata: "I campi rimanenti saranno sempre uguali a zero."
Risposta corretta: Le variabili locali automatiche non inizializzate esplicitamente rimangono con valori non inizializzati. L'inizializzazione parziale inizializza solo i campi specificati esplicitamente, gli altri hanno un valore indefinito (eccetto l'inizializzazione tramite = {...}, dove gli altri saranno zero solo per strutture statiche/globali).
Esempio:
void foo() { struct Point { int x, y, z; } p = {1}; // p.x == 1, p.y e p.z == 0 (Solo tramite = {1};) }
Storia
In un progetto di motore grafico è stato aggiunto un campo all'inizio della struttura del vertice, senza rivedere il modo generale di inizializzazione degli oggetti nei vari moduli. Di conseguenza, metà dei moduli ha iniziato a inizializzare in modo errato il colore o le coordinate, manifestandosi come artefatti di visualizzazione.
Storia
Nel gestore video, una struttura con puntatori annidati è stata inizializzata parzialmente = {0}, che è corretta per le variabili globali, ma non per le locali. Di conseguenza, i puntatori contenevano "spazzatura", portando a operare con indirizzi non validi e a crash difficili da individuare.
Storia
Quando sono stati aggiunti nuovi campi a una grande struttura, gli autori non hanno aggiornato le vecchie porzioni di codice con inizializzazione in ordine. A causa della non corrispondenza tra l'ordine dei campi e dei inizializzatori, le variabili critiche hanno iniziato a ricevere valori errati. L'audit della struttura e l'implementazione dell'inizializzazione nominata hanno solo aiutato a trovare la causa.