W C istnieje kilka sposobów inicjalizacji struktur:
struct Point { int x, y; }; struct Point p = {10, 20};
Pola są inicjalizowane w zadeklarowanej kolejności.
struct Point p = {.y = 20, .x = 10};
Można inicjalizować pola w dowolnej kolejności.
struct Rect { int x, y, w, h; } r = {1, 2}; // w i h == 0
struct Color { int r, g, b; }; struct Pixel { struct Point pos; struct Color col; }; struct Pixel px = {{10,20}, {255,0,0}};
Nazwana inicjalizacja pomoże uniknąć błędów:
struct Pixel px = {.col = {.r = 255, .g = 0, .b = 0}};
Pułapki:
Pytanie: Co się stanie, jeśli podczas inicjalizacji struktury nie podano jawnie wszystkich pól, a struktura została zadeklarowana jako automatyczna zmienna lokalna?
Oczekiwana błędna odpowiedź: "Pozostałe pola zawsze będą równe zeru."
Prawidłowa odpowiedź: Automatyczne (lokalne) zmienne, które nie są jawnie zainicjalizowane, pozostają z nieinicjalizowanymi wartościami. Częściowa inicjalizacja inicjalizuje tylko jawnie zapisane pola, pozostałe — nieokreślona wartość (z wyjątkiem inicjalizacji przez = {...}, gdzie pozostałe będą zerowe tylko dla statycznych/globalnych struktur).
Przykład:
void foo() { struct Point { int x, y, z; } p = {1}; // p.x == 1, p.y i p.z == 0 (Tylko przez = {1};) }
Historia
W projekcie silnika graficznego dodano pole na początku struktury wierzchołka, nie przeglądając wspólnego sposobu inicjalizacji obiektów w różnych modułach. W wyniku tego połowa modułów zaczęła niewłaściwie inicjalizować kolor lub współrzędne, co objawiło się w postaci artefaktów wyświetlania.
Historia
W obsłudze wideo struktura z zagnieżdżonymi wskaźnikami częściowo inicjalizowała się = {0}, co jest poprawne dla zmiennych globalnych, ale nie dla lokalnych. W efekcie wskaźniki zawierały „śmieci”, co prowadziło do pracy z nieważnymi adresami i trudnymi do uchwycenia awariami.
Historia
Przy dodawaniu nowych pól do dużej struktury autorzy nie zaktualizowali starych fragmentów kodu z inicjalizacją wg kolejności. Z powodu niezgodności kolejności pól i inicjalizatorów krytyczne zmienne zaczęły otrzymywać nieprawidłowe wartości. Znalezienie przyczyny pomogła tylko audyt struktury i wdrożenie nazwanej inicjalizacji.