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 />

set_array(pd, n);<br />

display_array(pd, n);<br />

free(pd);<br />

}<br />

return 0;<br />

Yukarıdaki programda programın çalışma zamanında kaç nesnenin istendiği bilgisi<br />

kullanıcıdan standart scanf işleviyle n değişkenine alınıyor. Daha sonra malloc işleviyle n<br />

tane int türden nesnenin sığacağı kadar büyüklükte bir dinamik bellek bloğu elde ediliyor.<br />

Elde edilen dinamik bellek bloğunun başlangıç adresinin pd isimli göstericiye atandığını<br />

görüyorsunuz. Artık başlangıç adresi pd ve boyutu n olan bir dizi söz konusudur, değil<br />

mi? set_array ve display_array işlevleri bu dizinin başlangıç adresi ve boyutu ile<br />

çağırılıyor.<br />

calloc İşlevi<br />

calloc işlevi malloc işlevine çok benzer. stdlib.h başlık dosyası içindeki bildirimi aşağıdaki<br />

gibidir.<br />

void *calloc(size_t nblock, size_t block_size);<br />

calloc işlevi heap alanından birinci parametresi ile ikinci parametresi çarpımı kadar<br />

byte'lık bir bellek bloğunu elde etmek için kullanılır. İşlevin geri dönüş değeri, yer ayırma<br />

işleminin başarılı olması durumunda, elde edilen bellek bloğunun başlangıç adresidir. Yer<br />

ayırma işlemi başarılı olmazsa calloc işlevi de malloc işlevi gibi NULL adresine geri döner.<br />

Elemanları int türden olan 100 elemanlı bir dizi için dinamik yer ayırma işlem calloc işlevi<br />

ile aşağıdaki gibi yapılabilir:<br />

void func()<br />

{<br />

int *pd;<br />

/***/<br />

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

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

printf("cannot allocate memory\n");<br />

exit(EXIT_FAILURE);<br />

}<br />

/***/<br />

}<br />

Şüphesiz yukarıdaki kod parçasında calloc işlevi şu şekilde de çağrılabilirdi:<br />

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

calloc işlevinin malloc işlevinden başka bir farkı da elde ettiği bellek bloğunu<br />

sıfırlamasıdır. calloc işlevi tarafından elde edilen bloğunun tüm byte'larında sıfır değerleri<br />

vardır. malloc işlevi calloc işlevine göre çok daha sık kullanılır. Ayrılan blok sıfırlanacaksa<br />

malloc işlevi yerine calloc işlevi tercih edilebilir.<br />

Yeri heap alanından elde edilen n elemanlı int türden bir dizinin elemanları sıfırlanmak<br />

istensin. Bu işlem malloc işlevi ile yapılırsa, dizinin elemanları ayrı bir döngü deyimi ile<br />

sıfırlanmalıdır:<br />

int main()<br />

{<br />

int *pd;<br />

int i;<br />

int n = rand() % 100 + 10;<br />

pd = (int *) malloc(sizeof(int) * n);<br />

331

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

Saved successfully!

Ooh no, something went wrong!