08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

}<br />

if (!pd) {<br />

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

exit(EXIT_FAILURE);<br />

}<br />

return pd;<br />

Yukarıda tanımlanan cmalloc isimli işlevin parametrik yapısı malloc işleviyle aynı<br />

olduğunu görüyorsunuz. İşlev malloc işlevinden farklı olarak, başarısızlık durumunda<br />

programı sonlandırıyor. malloc ile yapılacak bir dinamik blok elde etme girişiminin<br />

başarısız olması durmunda program bir hata iletisi verilerek sonlandırılacaksa, kaynak<br />

kodun sürekli yinelenmesi yerine, cmalloc işlevi çağrılabilir.<br />

malloc işlevinin geri dönüş değeri void türden bir adres olduğu için, bu adres sorunsuzca<br />

herhangi bir türden bir gösterici değişkene atanabilir. Ancak okunabilirlik açısından malloc<br />

işlevinin geri dönüş değeri olan adresin, tür dönüştürme işleci yardımıyla, kullanılacak<br />

gösterici değişkenin türüne dönüştürülmesi önerilir. Böylece malloc işlevi ile elde edilen<br />

bloğun hangi türden nesne ya da nesnelermiş gibi kullanılacağı bilgisi kodu okuyana<br />

verilmiş olur.<br />

C dilinin standartlaştırılmasından önceki dönemde yani klasik C döneminde, void türden<br />

göstericiler olmadığı için, malloc işlevinin geri dönüş değeri char türden bir adresti. Bu<br />

durumda, geri dönüş değeri olan adresin, char türü dışında bir göstericiye atanması<br />

durumunda tür dönüşümü bir zorunluluktu.<br />

malloc işlevi birden fazla kez çağrılarak birden fazla dinamik alan elde edilebilir. malloc<br />

işlevine yapılan farklı çağrılarla elde edilen blokların bellekte bitişik olması güvence<br />

altında değildir. Bu yüzden, her bir işlev çağrısının geri dönüş değeri olan adres mutlaka<br />

bir gösterici değişkende saklanmalıdır. Aşağıdaki kod parçası ardışık malloc çağrılarının<br />

bitişik bellek blokları elde edeceğini varsaydığı için yanlıştır:<br />

#include <br />

#include <br />

int main()<br />

{<br />

int *pd;<br />

int i;<br />

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

if (!pd) {<br />

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

exit(EXIT_FAILURE);<br />

}<br />

if (malloc(sizeof(int) * 10) == NULL) {<br />

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

exit(EXIT_FAILURE);<br />

}<br />

/* Yeni blok eski bloğun hemen altında olmak zorunda değildir */<br />

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

pd[i] = i;<br />

/*...*/<br />

}<br />

return 0;<br />

malloc işlevi ile elde edilen bloğun içinde çöp değerler vardır. Aşağıdaki kod parçası ile bu<br />

durumu sınayınız:<br />

326

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

Saved successfully!

Ooh no, something went wrong!