C'de yapıların başlatılmasının birkaç yolu vardır:
struct Point { int x, y; }; struct Point p = {10, 20};
Alanlar tanımlandığı sırayla başlatılır.
struct Point p = {.y = 20, .x = 10};
Alanlar herhangi bir sırayla başlatılabilir.
struct Rect { int x, y, w, h; } r = {1, 2}; // w ve h == 0
struct Color { int r, g, b; }; struct Pixel { struct Point pos; struct Color col; }; struct Pixel px = {{10,20}, {255,0,0}};
İsimlendirilmiş başlatma hataları önlemeye yardımcı olur:
struct Pixel px = {.col = {.r = 255, .g = 0, .b = 0}};
Sorunlar:
Soru: Bir yapı başlatılırken tüm alanlar açıkça belirtilmezse, ve yapı otomatik yerel bir değişken olarak tanımlanmışsa ne olur?
Beklenen yanlış cevap: "Geriye kalan alanlar her zaman sıfır olur."
Doğru cevap: Otomatik (yerel) değişkenler, açıkça başlatılmadığında başlatılmamış değerlerle kalır. Kısmi başlatma yalnızca açıkça belirtilen alanları başlatır, diğerleri için belirsiz değer ( = {...} ile yapılan başlatma durumunda, geri kalanlar yalnızca statik/yerel yapılar için sıfır olacaktır).
Örnek:
void foo() { struct Point { int x, y, z; } p = {1}; // p.x == 1, p.y ve p.z == 0 (Yalnızca = {1}; ile) }
Hikaye
Grafik motoru projesinde, bir yapı alanına ekleme yapıldı ancak farklı modüllerdeki nesnelerin başlatma yöntemleri gözden geçirilmedi. Sonuç olarak, modüllerin yarısı renk ya da koordinatları yanlış başlatmaya başladı ve bu, görüntüleme hataları olarak göründü.
Hikaye
Video işleyicisinde, iç işaretçileri olan bir yapı = {0} ile kısmi olarak başlatıldı; bu küresel değişkenler için doğruydu ancak yerel değişkenler için değildi. Sonuç olarak, işaretçiler "çöp" içeriyordu ve geçersiz adreslerle çalışmaya yol açarak zorlu hata ayıklamalara neden oldu.
Hikaye
Büyük bir yapıya yeni alanlar eklenirken, yazarlar eski kısmi başlatma kodlarını güncellemedi. Alanlar ve başlatıcılar arasındaki sıranın uyuşmaması nedeniyle kritik değişkenler hatalı değerler almaya başladı. Sorunu bulmak için yapı denetimi ve isimlendirilmiş başlatma uygulama ile bir araya gelindi.