Soru tarihçesi:
Yığın belleği tüm temel mimarilerde bulunmaktadır. C dilinde otomatik (yerel) değişkenler yığın üzerinde yerleştirilerek dinamik kuyruk ile karşılaştırıldığında bellek tahsis ve serbest bırakma hızını artırır.
Sorun:
Yığın kullanımı boyut açısından sınırlıdır, otomatik değişkenler bloktan çıkıldığında otomatik olarak yok edilir ve yığın sınırını aşmak (stack overflow) programın çökmesine veya veri bozulmasına neden olur.
Çözüm:
Fonksiyonlar içinde özel bir modifikatör olmadan tanımlanan yerel değişkenler yığın üzerinde yerleştirilir. Bu otomatik depolama alanı, fonksiyona girişte oluşturulur ve çıkışta yok edilir. Yığının boyutu sınırlıdır ve sadece bağlantı/ sistem seçenekleri ile değiştirilebilir.
Kod örneği:
#include <stdio.h> void foo() { int arr[100]; // yığında yerleştirildi for (int i = 0; i < 100; ++i) arr[i] = i; printf("İlk eleman: %d\n", arr[0]); } // arr, foo'dan çıkıldığında yok edilir
Ana özellikler:
Fonksiyondan bir yerel değişkeni adres ile döndürebilir misiniz?
Hayır, çünkü değişken fonksiyondan çıkıldığında yok edilir ve oluşan "askıda kalan işaretçi" belirsiz davranışa yol açar.
int* bad() { int x = 42; return &x; // hata: döndürülen işaretçi serbest bırakılmış yığını gösteriyor }
Yığında büyük bir dizi (örneğin, 1 MB) yerleştirmek mümkün mü?
Çoğu sistemde yığın boyutu sınırlıdır (onlarca ile yüzlerce KB arasında). Yığında büyük diziler tanımlamaya çalışmak stack overflow ile sonuçlanır.
Statik ve otomatik değişkenler arasındaki fark nedir?
Statik değişkenler (fonksiyon içinde bile) statik bellek alanında yerleştirilir, çağrılar arasında temizlenmezler, otomatikler ise yığında yer alır ve bloktan çıkıldığında yok edilirler.
Hesaplamalar için 8192*1024 double dizisi yığında tahsis edildi. Program, Linux'ta çalıştırıldığında SIGSEGV hatası aldı, ancak hatasız derlenmişti.
Artıları:
Eksileri:
Büyük tamponlarla çalışmak için dinamik bellek tahsisi kullanıldı (malloc/free). Yığında yalnızca küçük çalışma değişkenleri yer aldı.
Artıları:
Eksileri: