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

Bu durumda ptr göstericisi halen daha önce elde edilen bloğun başlangıç adresini<br />

gösteriyor.<br />

C standartları realloc işlevi ile ilgili olarak aşağıdaki kuralları getirmiştir:<br />

i) Daha önce elde edilen bir bellek bloğunu büyütmesi durumunda, realloc işlevi bloğa<br />

eklenen kısma herhangi bir şekilde değer vermez. Yani eski bloğa eklenen yeni blok<br />

içinde çöp değerler (garbage values) bulunur.<br />

realloc işlevi eğer daha önce elde edilmiş bellek bloğunu büyütemez ise NULL adresi ile<br />

geri döner ancak daha önce elde edilmiş olan ve büyütülemeyen bellek bloğundaki<br />

değerler korunur.<br />

ii) Eğer realloc işlevine gönderilen birinci argüman NULL adresi olursa, realloc işlevi<br />

tamamen malloc işlevi gibi davranır. Yani:<br />

realloc(NULL, 100);<br />

ile<br />

malloc(100);<br />

çağrıları tamamen aynı anlamdadır. Her ikisi de 100 byte'lık bir dinamik alan elde etmeye<br />

çalışır.<br />

Buna neden gerek görülmüştür? Yani neden malloc(100) gibi bir çağrı yapmak yerine<br />

realloc(NULL, 100) şeklinde bir çağrı tercih edilebilir?<br />

Aşağıdaki programı inceleyin:<br />

#include <br />

#include <br />

#include <br />

#include <br />

void display_array(const int *ptr, int size);<br />

int get_max(const int *ptr, int size);<br />

int get_min(const int *ptr, int size);<br />

double get_ave(const int *ptr, int size);<br />

double get_stddev(const int *ptr, int size);<br />

int main()<br />

{<br />

int *ptr = NULL;<br />

int ch, grade;<br />

int counter = 0;<br />

for (;;) {<br />

printf("not girmek istiyor msunuz? [e] [h]\n");<br />

while ((ch = toupper(getch())) != 'E' && ch != 'H')<br />

;<br />

if (ch == 'H')<br />

break;<br />

printf("notu giriniz : ");<br />

scanf("%d", &grade);<br />

counter++;<br />

ptr = (int *) realloc(ptr, sizeof(int) * counter);<br />

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

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

exit(EXIT_FAILURE);<br />

}<br />

335

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

Saved successfully!

Ooh no, something went wrong!