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

*per.name_ptr<br />

per.name_ptr[n]<br />

ifadelerine gösterici hatası oluşturmadan atama yapabilmek için, önce eleman olan<br />

göstericinin güvenilir bir yeri göstermesi gerekir.<br />

Bir yapının elemanının bir gösterici olması çoğu zaman, yapı nesnesinin dinamik olarak<br />

elde edilen bir bellek alanını kullanması amacıyla istenir. Aşağıdaki kod parçasını<br />

inceleyin:<br />

#include <br />

#include <br />

#include <br />

#define ARRAY_SIZE 100<br />

struct Person {<br />

char *name_ptr;<br />

int no;<br />

};<br />

int main()<br />

{<br />

struct Person per;<br />

char name_entry[ARRAY_SIZE];<br />

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

gets(name_entry);<br />

per.name_ptr = (char *)malloc(strlen(name_entry) + 1);<br />

if (per.name_ptr == NULL) {<br />

printf("bellek tahsis edilemiyor!\n");<br />

exit(EXIT_FAILURE);<br />

}<br />

strcpy(per.name_ptr, name_entry);<br />

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

scanf("%d", &per.no);<br />

printf("isim = %s\nNo : %d\n", per.name_ptr, per.no);<br />

/*...*/<br />

free(per.name_ptr);<br />

}<br />

return 0;<br />

main işlevi içinde yapılanları sırasıyla inceleyelim: Önce struct Person türünden per isimli<br />

bir değişkenin tanımlandığını görüyorsunuz. Klavyeden girilen isim, önce standart gets<br />

işleviyle yerel name_entry dizisine alınıyor. Yerel diziye alınmış ismin uzunluğunun 1<br />

fazlası kadar byte'lık bir alan malloc işleviyle dinamik olarak elde ediliyor. Yazı<br />

uzunluğunun 1 fazlası kadar yer ayrılması yazının sonunda yer alacak sonlandırıcı<br />

karakter için de yer sağlanması amacı taşıyor. Dinamik alanın başlangıç adresinin per<br />

nesnesinin name_ptr elemanında saklandığını görüyorsunuz. Daha sonra standart strcpy<br />

işleviyle yerel dizideki isim ayrılan dinamik bloğa kopyalanıyor.<br />

per nesnesi böylece kendi elemanı olan name_ptr göstericisi yoluyla dinamik bir alanı<br />

kontrol eder hale geliyor, değil mi? Bir struct Person nesnesinin tuttuğu isme ulaşmak için<br />

önce nesnenin name_ptr elemanına erişip bu elemanın değerinden de dinamik bloğa<br />

erişilebilir. Nesnenin ömrünün sona ermesinden önce, bellek sızıntısını (memory leak)<br />

engellemek amacıyla, dinamik bloğun geri verilmesi gerekir.<br />

369

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

Saved successfully!

Ooh no, something went wrong!