ProgramlamaGömülü C Geliştirici

C dilinde farklı depolama türlerinde (otomatik, statik, küresel) değişkenler nasıl başlatılır? Bu, programın güvenliği ve düzgün çalışması üzerinde nasıl bir etki yapar?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

C dilinde değişkenler, depolama belirticisine bağlı olarak farklı şekillerde başlatılır:

  • Otomatik (yerel) değişkenler: Açıkça başlangıç değeri verilmedikçe, atanmamış (çöp) bir değere sahiptir. İçeriği, daha önceki yığın belleğidir.
  • Statik yerel ve küresel değişkenler (static, extern): Her zaman sıfırlara (skalarlar için — 0, işaretçiler için — NULL) veya bağlayıcı aşamada verilen bir değere 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.

Aldatıcı Soru

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ış }

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


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.