ProgramlamaC geliştirici

C dilinde yığın ile heap arasındaki farkı açıklayın ve hangi durumlarda hangi tür belleği kullanmak daha iyidir?

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

Cevap.

C dilinde değişkenler için bellek, ya yığın (stack) ya da heap ile ayrılabilir.

  • Yığın — işlev içine girildiğinde bellek otomatik olarak ayrılır ve çıkıldığında serbest bırakılır. Hızlıdır, ancak bellek miktarı yüğünün boyutu (genellikle birkaç MB) ile sınırlıdır.
  • Heap — bellek dinamik olarak malloc, calloc, realloc ile ayrılır ve free ile manuel olarak serbest bırakılır. Bellek miktarı sistemin imkanları ile sınırlıdır, ancak erişim daha yavaştır ve serbest bırakma manuel olarak kontrol edilir.

Yığın ne zaman kullanılmalı:

  • Boyutu küçük ve derleme aşamasında bilinen yerel değişkenler için.
  • Fonksiyon argümanları ve küçük diziler için.

Heap ne zaman kullanılmalı:

  • Bellek boyutunun önceden bilinmediği durumlarda.
  • Büyük veya uzun ömürlü nesneler için.

Kod örneği:

// Yığında int arr[10]; // Heap'te int* parr = malloc(sizeof(int) * 10); // Bellek serbest bırakmayı unutmayın free(parr);

Kandırmaca soru.

Soru: malloc ile ayrılan bir diziye free fonksiyonu çağrılmazsa ne olur?

Cevap: Bellek sızıntısı (memory leak) olur. Dinamik olarak ayrılan bellek otomatik olarak serbest bırakılmaz ve zamanla bu, uygulamanın bellek tükenmesine veya tüm sistemin bellek tükenmesine yol açabilir.

Kod örneği:

void leak() { int* leakArr = malloc(100 * sizeof(int)); // free(leakArr) çağrılmadı, bellek kaybolur }

Hikaye

Bir projede programcılar, oturumun tanımlandığı yapı için bellek ayırıp malloc ile free çağrısı yapmayı unuttular. Sonuç olarak, proje birkaç gün boyunca bellek kaybetti ve sunucu "yetersiz bellek" hatası ile çöküyordu. Sorun, Valgrind ile profil çıkarma yapıldıktan sonra tüm eksik free'ler düzeltildikten sonra çözüldü.


Hikaye

Bir geliştirici, geçici hesaplamalar için yığında büyük bir dizi (10 MB'a kadar) ayırdı. Küçük yığın boyutuna sahip bir sunucuda bu, uygulamanın stack overflow hatası ile çökmesine yol açıyordu. Analiz yapıldıktan sonra tampon heap'e taşındı.


Hikaye

Geliştiricilerden biri uzun dizeleri yığında saklamaya karar verdi, ancak dize boyutu kullanıcı tarafından belirleniyordu. Çok uzun bir dize girildiğinde, uygulama bellek erişim hatası ile çöküyordu. Sonuç olarak, girilen verilerin uzunluğunu kontrol ederek heap'e taşınması kararlaştırıldı.