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

2. realloc işlevi daha önce ayrılan bloğun altında boş yer bulamamış ya da bu yönde bir<br />

büyütme işlemini tercih etmemiş olabilir. Ve heap alanında toplam<br />

(n + nplus) * sizeof(int)<br />

kadar byte'lık başka bir boş blok ayarlamış olabilir. Bu durumda realloc işlevi daha önce<br />

elde edilmiş alandaki değerleri de bu alana kopyalayarak eski bloğu sisteme geri<br />

vermiştir.<br />

realloc işlevinin bu davranışından dolayı geri dönüş değeri bir gösterici değişkene mutlaka<br />

atanmalıdır. Aşağıda sık yapılan tipik bir hata görülüyor:<br />

#include <br />

#include <br />

int main()<br />

{<br />

char *p;<br />

p = malloc(10);<br />

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

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

exit(EXIT_FAILURE);<br />

}<br />

/***/<br />

if (realloc (p, 20) == NULL) {<br />

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

exit(EXIT_FAILURE);<br />

}<br />

gets(p);<br />

}<br />

return 0;<br />

realloc işlevinin başarılı olması daha önce elde edilen bloğun altına yani daha büyük<br />

sayısal adrese doğru ek blok sağladığı anlamına gelmez. realloc işlevi daha önce elde<br />

edilmiş dinamik alanı başka bir yere taşıyarak yeni bloğun başlangıç adresiyle geri<br />

dönmüş olabilir. Bu durumda eski blok serbest bırakılır, artık bu adresin bir güvenilirliği<br />

yoktur.<br />

Yukarıdaki örnekte realloc işlevinin, daha önce elde edilen bloğu bulunduğu yerde<br />

büyüttüğü varsayılıyor. Eğer realloc işlevi bellek bloğunu başka bir yere taşıyarak<br />

büyütmüşse, yukarıdaki kodda bir gösterici hatası yapılmış olur, çünkü artık p<br />

göstericisinin gösterdiği adres güvenilir bir adres değildir.<br />

Bu yüzden uygulamalarda genellikle realloc işlevinin geri dönüş değeri, realloc işlevine<br />

değeri gönderilen göstericiye atanır:<br />

ptr = realloc(ptr, 100);<br />

Ancak bu bir zorunluluk değildir. Eğer realloc işlevi ile yapılan yer ayırma işleminin<br />

başarılı olmaması durumunda program sonlandırılmayacaksa ve daha önce dinamik<br />

olarak elde edilen bölgedeki değerler bir dosyaya yazılacak ise, artık realloc işlevinin<br />

başarısız olması durumunda, ptr göstericisine NULL adresi atanacağı için ptr göstericisinin<br />

daha önce elde edilen blok ile ilişkisi kesilmiş olur.<br />

Böyle bir durumda geçici bir gösterici kullanmak uygun olur:<br />

temp = realloc(ptr, 100);<br />

if (temp == NULL)<br />

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

334

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

Saved successfully!

Ooh no, something went wrong!