C dilinde değişkenler, depolama belirticisine bağlı olarak farklı şekillerde başlatılır:
Farklılıkların bir örneği:
void example() { int a; // otomatik, başlatılmamış static int b; // 0 olarak başlatılmış printf("a=%d, b=%d ", a, b); } int c; // küresel, 0 olarak başlatılmış
Hatalar, başlatma ile ilgili yanlış varsayımlardan kaynaklanır. Güvenlik için her zaman değişkenleri açıkça başlatın.
Bir otomatik yerel değişken, blok dışında fonksiyon düzeyinde tanımlandığında 0 ile başlatılır mı?
Cevap:
Hayır! Değişken, fonksiyonun başında tanımlansa bile, açık bir başlatma olmadan, atanmamış durumda kalır:
void f() { int x; printf("%d ", x); // UB: x başlatılmamış }
Hikaye
Bir banka yazılımında, bir fonksiyon içindeki karşılık gelen sayaç için başlatmanın atlanması, bazen muazzam negatif bir sayıya neden oldu — sonuç: müşteriye yanlış bonuslar verildi, hata ancak gerçek verilerde tespit edildi.
Hikaye
Bir multimedya görüntü işleyici, başlangıçta statik dizilerin her zaman sıfırlar ile dolu olduğunu varsayıyordu. Başka bir derleyiciye (standart dışı bir ortamla) geçtikten sonra segment hatası ile karşılaştılar — bellek parçalarının işlemciye fiziksel olarak verilmediği anlaşıldı.
Hikaye
Bir kriptografi kütüphanesinde, geliştirici geçici şifre tamponunu başlatmadı, global bölümden şifre tamponunun her zaman sıfırlarla dolu olduğunu düşündü, ancak eski hassas verilerin kaldığı bir bellek durumu meydana geldi. Bu, şifrelerin döküm sırasında sızmasına neden oldu.