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

get_name işlevi içinde yerel bir dizi tanımlanıyor. Kullanıcının girdiği isim yerel diziye<br />

yerleştiriliyor, daha sonra yerel dizinin adresiyle geri dönülüyor.<br />

Yerel değişkenlerin otomatik ömürlü olduğunu, yani ait oldukları bloğun yürütülmesi<br />

sonunda bellekten boşaltıldıklarını biliyorsunuz. get_name işlevinin geri dönüş değeri,<br />

yani yerel name_entry dizisinin başlangıç adresi main işlevi içinde ptr göstericisine<br />

atanıyor. Oysa artık yerel dizi bellekten boşaltıldığı için, ptr gösterici değişkenine atanan<br />

adresin hiçbir güvenilirliği yoktur. ptr göstericisinin gösterdiği yerden okuma yapmak ya<br />

da buraya yazmak gösterici hatasıdır.<br />

Adrese geri dönen bir işlev yerel bir değişkenin adresiyle ya da yerel bir dizinin başlangıç<br />

adresiyle geri dönmemelidir. Yukarıda yazılan getname işlevinin çağrılması çalışma<br />

zamanı hatasına neden olur. C derleyicilerinin çoğu, bu durumu mantıksal bir uyarı iletisi<br />

ile belirler.<br />

NULL Adres Değişmezi (Null Gösterici)<br />

Bir gösterici değişken, içinde adres bilgisi tutan bir nesnedir, değil mi?<br />

int x = 10;<br />

int *ptr = &x;<br />

Yukarıdaki deyimleri aşağıdaki cümlelerle ifade edebiliriz:<br />

ptr göstericisi x nesnesinin adresini tutuyor.<br />

ptr göstericisi x nesnesini gösteriyor.<br />

*ptr nesnesi , ptr'nin gösterdiği nesnedir.<br />

*ptr , x nesnesinin kendisidir.<br />

Öyle bir gösterici olsun ki hiçbir nesneyi göstermesin. Hiçbir yeri göstermeyen bir<br />

göstericinin değeri öyle bir adres olmalıdır ki, bu adresin başka hiçbir amaçla<br />

kullanılmadığı güvence altına alınmış olsun. İşte hiçbir yeri göstermeyen bir adres olarak<br />

kullanılması amacıyla bazı başlık dosyalarında standart bir simgesel değişmez<br />

tanımlanmıştır. Bu simgesel değişmez NULL simgesel değişmezi olarak bilinir.<br />

NULL bir simgesel değişmezdir. Bu simgesel değişmez standart başlık dosyalarından<br />

stdio.h, string.h ve stddef.h içinde tanımlanmıştır.<br />

NULL adresi herhangi türden bir göstericiye atanabilir. Böyle bir atama tamamen<br />

sözdizimsel kurallara uygundur, uyarı gerektiren bir durum da söz konusu değildir.<br />

int *iptr = NULL;<br />

char *cptr = NULL;<br />

double *dptr = NULL;<br />

NULL adresi hiçbir yeri göstermeyen bir göstericinin değeridir. Bir gösterici ya bir nesneyi<br />

gösterir (yani bu durumda göstericinin değeri gösterdiği nesnenin adresidir) ya da hiçbir<br />

nesneyi göstermez (bu durumda göstericinin değeri NULL adresidir).<br />

Bir adres bilgisinin doğru ya da yanlış olarak yorumlanması söz konusu olduğu zaman,<br />

adres bilgisi NULL adresi ise "yanlış" olarak yorumlanır. NULL adresi dışındaki tüm adres<br />

bilgileri "doğru" olarak yorumlanır. ptr isimli bir göstericinin değeri NULL adresi değil ise,<br />

yani ptr göstericisi bir nesneyi gösteriyorsa bir işlev çağrılmak istensin. Böyle bir if<br />

deyiminin koşul ifadesi iki ayrı biçimde yazılabilir:<br />

if (ptr != NULL)<br />

foo();<br />

if (ptr)<br />

foo();<br />

258

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

Saved successfully!

Ooh no, something went wrong!