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

Gösterici Hataları<br />

Göstericileri kullanarak RAM üzerinde bir bölgeye erişilebilir. Bir programın çalışması<br />

sırasında bellekte çalışıyor durumda olan başka programlar da olabilir. Göstericileri<br />

kullanarak o anda çalışmakta olan programın bellek alanına veri aktarılırsa oradaki<br />

programın kodu bozulacağı için programın çalışmasında çeşitli bozukluklar çıkabilir. Bu<br />

bozukluk tüm sistemi olumsuz yönde etkileyebilir.<br />

Kim tarafından kullanıldığını bilmediğimiz bellek bölgelerine güvenli olmayan bölgeler<br />

denir. Güvenli olmayan bölgelere erişilmesine ise "gösterici hataları" denir.<br />

Gösterici hataları yapıldığında sistem kilitlenebilir, programlar yanlış çalışabilir. Gösterici<br />

hataları sonucundaki olumsuzluklar hemen ortaya çıkmayabilir.<br />

Gösterici hataları güvenli olmayan bölgelere erişildiğinde değil oralara veri aktarıldığında<br />

oluşur.<br />

Gösterici hataları derleme sırasında derleyici tarafından saptanamaz. Bu tür hatalar<br />

programın çalışma zamanı sırasında olumsuzluklara yol açar. Tanımlama yöntemiyle elde<br />

edilmiş olan bellek bölgelerine güvenli bölgeler denir. Bir nesne tanımlandığında, o nesne<br />

için derleyici tarafından bellekte ayrılan yer, programcı için ayrılmış bir alandır ve<br />

güvenlidir.<br />

Gösterici Hatası Oluşturan Tipik Durumlar<br />

i)İlkdeğer Verilmemiş Göstericilerin Yol Açtığı Hatalar:<br />

Daha önce belirtildiği gibi göstericiler de birer nesnedir. Diğer nesnelerden farkları<br />

içlerinde adres bilgileri tutmalarıdır. Göstericiler de nesne olduklarına göre diğer nesneler<br />

gibi yerel ya da global olabilirler. Global olarak tanımlanmış göstericiler 0 değeriyle<br />

başlatılırken, yerel göstericiler çöp değerleriyle başlatılır:<br />

Yerel bir gösterici tanımlandıktan sonra, herhangi bir şekilde bu göstericiye bir değer<br />

ataması yapılmaz ise göstericinin içinde rastgele bir değer bulunacağından, bu gösterici *<br />

işleci ile ya da [ ] işleci ile kullanıldığında, bellekte rastgele bir yerde bulunan bir<br />

nesneye ulaşılır. Dolayısıyla, elde edilen nesneye bir atama yapıldığı zaman, bellekte,<br />

bilinmeyen rastgele bir yere yazılmış olunur. Bu durum tipik bir gösterici hatasıdır.<br />

Örnekler :<br />

int main()<br />

{<br />

int *p;<br />

*p = 25; /* YANLIŞ */<br />

}<br />

return 0;<br />

Yukarıdaki örnekte tanımlanan p göstericisinin içinde bir çöp değer var.<br />

*p = 25;<br />

deyimiyle rastgele bir yere yani güvenli olmayan bir yere veri aktarılıyor. Verinin<br />

aktarıldığı yerde işletim sisteminin, derleyicinin ya da bellekte kalan başka bir programın<br />

(memory resident) kodu bulunabilir. Bazı sistemlerde verinin aktarıldığı yerde programın<br />

kendi kodu da bulunabilir.<br />

İlkdeğer verilmemiş global göstericilerin içinde (ya da statik yerel göstericilerin içinde)<br />

sıfır değeri bulunur. Sıfır sayısı (NULL adresi) göstericilerde sınama amacıyla kullanılır. Bu<br />

adrese bir veri aktarılması durumunda, derleyicilerin çoğunda isteğe bağlı olarak bu hata<br />

çalışma zamanı sırasında sınanır. Örnek:<br />

280

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

Saved successfully!

Ooh no, something went wrong!