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

malloc işlevinin başarısı bir if deyimiyle sınanıyor. Başarısızlık durumunda, yani malloc<br />

işlevinin geri dönüş değerinin NULL adresi olması durumunda standart exit işlevi<br />

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

Daha sonra elde edilen dinamik blok int türden bir dizi olarak kullanılıyor. Dinamik dizinin<br />

elemanlarına 0 - 100 aralığında rastgele değerler atanıyor.<br />

Kaynak kodun taşınabilirliği açısından kullanılacak bellek bloğunun büyüklüğü sizeof<br />

işleciyle elde edilmelidir.<br />

Şüphesiz, malloc işlevi başarısız olduğunda programı sonlandırmak zorunlu değildir.<br />

Atama ile sınama bir defada da yapılabilir.<br />

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

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

exit(EXIT_FAILURE);<br />

}<br />

malloc işlevinin başarısı mutlaka sınanmalıdır. İşlevin başarısız olması durumunda, geri<br />

dönüş değeri olan adresten okuma ya da yazma yapılması, NULL adresinin içeriğinin<br />

alınmasına neden olur. Bu da bir gösterici hatasıdır.<br />

Programcılar çoğu kez, küçük miktarlarda çok sayıda bloğun ayrılması durumunda,<br />

sınamayı gereksiz bulma eğilimindedir. Oysa sınama işleminden vazgeçmek yerine daha<br />

kolaylaştırıcı yöntemler denenmelidir. Örneğin p1, p2, p3, p4, p5 gibi 5 ayrı gösterici<br />

değişkenin her biri için n byte dinamik alan elde edilmek istensin. Bu durumda sınama<br />

mantıksal işleçler ile tek bir if deyimi ile yapılabilir.<br />

#include <br />

#include <br />

int main()<br />

{<br />

char *p1, *p2, *p3, *p4, *p5;<br />

p1 = (char *)malloc(n);<br />

p2 = (char *)malloc(n);<br />

p3 = (char *)malloc(n);<br />

p4 = (char *)malloc(n);<br />

p5 = (char *)malloc(n);<br />

}<br />

if (!(p1 && p2 && p3 && p4 && p5)) {<br />

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

exit(EXIT_FAILURE);<br />

}<br />

/*....*/<br />

malloc çağrılarından herhangi biri başarısız olursa<br />

!(p1 && p2 && p3 && p4 && p5)<br />

ifadesi "doğru" olarak yorumlanacağından if deyiminin doğru kısmı yapılır.<br />

Bazen de malloc işlevi programcı tarafından tanımlanan başka bir işlev ile sarmalanır:<br />

#include <br />

#include <br />

void *cmalloc(size_t n)<br />

{<br />

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

325

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

Saved successfully!

Ooh no, something went wrong!