08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

}<br />

/***/<br />

for (i = 0; i < n; ++i)<br />

ptr[i] = 0;<br />

/***/<br />

Oysa calloc işlevi zaten sıfırlama işlemini kendi içinde yapar:<br />

pd = calloc(sizeof(int) , n);<br />

Derleyicilerin çoğunda calloc işlevi, bellekte yer ayırma işlemini yapması için, kendi içinde<br />

malloc işlevini çağırır.<br />

Bellekte Sızıntı<br />

Dinamik bellek işlevleriyle heap alanından elde edilen bir blok free işlevi çağrısına kadar<br />

tutulur. Dinamik bloğun başlangıç adresi kaybedilirse, artık programın sonuna kadar bu<br />

bloğu kullanma şansı olmadığı gibi blok heap alanına geri de verilemez. Bu durum<br />

bellekte sızıntı (memory leak) olarak isimlendirilir. Bir işlev içinde dinamik bir bloğun elde<br />

edildiğini ancak işlev içinde bu bloğun heap alanına geri verilmediğini düşünün:<br />

void process()<br />

{<br />

char *pd = (char *)malloc(1000);<br />

if (pd == NULL) {<br />

printf("dinamik bir blok elde edilemiyor!\n");<br />

exit(EXIT_FAILURE);<br />

}<br />

/***/<br />

}<br />

process isimli işlev her çağrıldığında 1000 byte'lık bir alan elde ediliyor. Ancak işlev içinde<br />

elde edilen dinamik alan heap alanına geri verilmiyor. Bu durumda process işlevine<br />

yapılan her çağrı ile heap alanından 1000 byte'lık bir alan bloke edilmiş olur. process<br />

işlevin ana program içinde çok sık çağrılan bir işlev olduğu düşünülürse, belirli bir çağrı<br />

sayısından sonra heap alanı tümüyle tüketilebilir. Yani belirli bir süre sonra artık malloc<br />

işlevi yeni bir bloğu elde edemeyecek duruma gelir.<br />

realloc işlevi<br />

realloc işlevi daha önce malloc ya da calloc işlevleriyle elde edilmiş bir bellek bloğunu<br />

büyütmek ya da küçültmek için çağrılır. İşlevin bildirimi stdlib.h başlık dosyası içindedir.<br />

void *realloc(void *block, size_t newsize);<br />

realloc işlevine gönderilen birinci argüman, daha önce elde edilen bir bellek bloğunun<br />

başlangıç adresi, ikinci argüman ise yeni bloğun toplam uzunluğudur.<br />

realloc işlevi ile dinamik bir blok büyütülmek istendiğinde, işlev, bloğu daha yüksek<br />

sayısal adrese doğru büyütmek zorunda değildir. realloc işlevi, daha önce elde edilmiş<br />

bloğun bittiği yerde, istenilen uzunlukta bir blok bulamazsa ya da dinamik alanı bu yönde<br />

büyütmek istemezse, bu kez bloğun tamamı için bellekte kullanılmayan başka bir yer<br />

araştırır. Eğer istenilen toplam uzunlukta ardışıl bir blok bulunursa burayı ayırır, eski<br />

bellek bloğundaki değerleri yeni yere taşır ve eski bellek bloğunu sisteme geri verir.<br />

İstenen uzunlukta sürekli bir alan bulunamazsa işlev NULL adresiyle geri döner.<br />

Aşağıdaki programda yapılan dinamik bellek işlemlerini inceleyin:<br />

332

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!