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

Yukarıdaki main işlevinde önce malloc işlevi ile 1000 byte'lık bir blok elde edilerek bloğun<br />

başlangıç adresi pd gösterici değişkenine atanıyor. Daha sonra çağrılan free işlevine pd +<br />

500 adresinin argüman olarak gönderildiğini görüyorsunuz. Böyle bir çağrı ile free<br />

işlevinin daha önce ayrılan 1000 byte'lık alanın 500 byte'ını geri vermesi söz konusu<br />

değildir.<br />

pd + 500 adresi bir dinamik alanın başlangıç adresi değildir. Bu yüzden işlev çağrısı<br />

tanımsız davranış özelliği gösterir. Bir malloc çağrısı ile elde edilen dinamik alan free<br />

işlevine yapılan bir çağrıyla küçültülemez.<br />

free işlevine dinamik bir bloğun başlangıç adresi dışında başka bir adresin geçilmesi<br />

tanımsız davranıştır. Bu durumun tek istisnası free işlevine NULL adresinin geçilmesidir.<br />

İşleve NULL adresinin geçilmesi tanımsız davranışa neden olmaz, yalnızca bir işleme<br />

neden olmayan (no operation) çağrıdır:<br />

if (ptr)<br />

free(ptr);<br />

ptr bir gösterici değişken olmak üzere yukarıdaki if deyiminde ptr değişkeninin değeri<br />

NULL adresi değilse free işlevi çağrılıyor.<br />

Bu if deyimi yerine free işlevi doğrudan çağrılsa da kodun anlamında fazlaca bir değişiklik<br />

olmazdı.<br />

Dinamik Bir Dizinin Kullanılması<br />

malloc işlevi ile elde edilen bir bellek bloğu boyutu programın çalışma zamanında elde<br />

edilen bir dizi olarak kullanılabilir. Aşağıdaki programı derleyerek çalıştırın:<br />

#include <br />

#include <br />

#include <br />

void set_array(int *ptr, int size)<br />

{<br />

int k;<br />

for (k = 0; k < size; ++k)<br />

ptr[k] = rand() % 100;<br />

}<br />

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

{<br />

int k;<br />

for (k = 0; k < size; ++k)<br />

printf("%2d ", ptr[k]);<br />

printf("\n");<br />

}<br />

int main()<br />

{<br />

int n;<br />

int *pd;<br />

printf("kac tane tamsayi : ");<br />

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

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

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

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

exit(EXIT_FAILURE);<br />

}<br />

srand(time(0));<br />

330

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

Saved successfully!

Ooh no, something went wrong!