Tam Sürümünü Görmek İçin : Bu tanım ne iş yapar?
Acayip kodlar yarışmasında birinci olan bir kodu incelerken gözüme çarptı. Normal olarak derleniyor. fakat ekrana yazdırmaya calisirken tampon taşması meydana geliyor. Daha once boyle bir tanim gormemistim. Ne demek anlayabilien varmı?
int main(){
char a="Merhaba"[10];
}
golgepapaz
21/05/2007, 08:59
evet, Merhabanin 10 uncu karakterini isaret ediyor,
"Merhaba"nin tipi const char[8], yani bir array.
"Merhaba"[0], 'M' oluyor mesela...
acehreli
21/05/2007, 09:16
Bunun bir benzerini hatirladim:
char r = 2["Merhaba"];
Tamamen yasal; ve o yuzden de derlenen, ve calisan bir kod. :D
Ali
C dillerinin şu esnek yapısına hayranım. Yazılan her şey çalışabilen bir kod olabiliyor.
Arkadaşların da dediği gibi, "Merhaba" bir char dizisi. Uzunluğu 8 olduğundan, ilk indisi 0 ve son indisi 7. 8,9,10... değerleri dizinin dışına taştığı için hata veriyor :)
Yazdırmandaki sorun yazım formatında olabilir karakter dizisi formatında yazırıyorsan dizini \0 ile sonlandırman gerekiyor.
Karakter olarak tanımladıysan da atama sırasında karakter dizisine dönüştürülmüş olabilir gibi geldi bana
acehreli
21/05/2007, 20:51
mr_c, sabit dizgilerin sonunda zaten '\0' karakteri bulunur. O yuzden golgepapaz "Merhaba"nin 8 karakterlik bir dizi oldugunu soyluyor.
Ali
Sabit dizgiler tabiki 0 sonlandırılmıştır. ama karakteri dizgi gibi yazdırmaya kalkmış olması ihtimalinden şüpheleniyorum.
golgepapaz
21/05/2007, 21:20
Bunun bir benzerini hatirladim:
char r = 2["Merhaba"];
Tamamen yasal; ve o yuzden de derlenen, ve calisan bir kod. :D
Ali
Nasil oldugunu cozemeyenler icin tanim geregi a[b], *(a+b) demek
toplamanin degisme ozelligi oldugu icin,b[a], *(b+a) ==*(a+b) oluyor. bu yuzden isaretci aritmetigine gore,ikisi de ayni yeri gosteriyor.(elemanlardan birinin isaretci digerinide sabit olmasi gerekiyor. yani 2[3] gibi birsey yaparsaniz hata alirsiniz...)
Yani benim tanıdığım c ise taşma kontorlü yapmaz ve o bellek gözündeki yani dizinin bitimindeki veriyi okumaya devam edebilir.
golgepapaz
21/05/2007, 21:23
Sabit dizgiler tabiki 0 sonlandırılmıştır. ama karakteri dizgi gibi yazdırmaya kalkmış olması ihtimalinden şüpheleniyorum.
olmayan onuncu elemana erismeye calisiyor, sonuc tamamen implementasyon'a bagimli C++ 'ya gore UB..
olmayan onuncu elemana erismeye calisiyor, sonuc tamamen implementasyon'a bagimli C++ 'ya gore UB..
Ben de tam olarak bunu anlattım bir önceki mesajımda C açısından bir problem yok karakter olarak ne bulursa onu yazar, tabi dizi olarak yazdırmaya kalktığında 0 sonlandırılmamış bir karakter dizi olmadığından taşma olur.
acehreli
21/05/2007, 21:38
Yazdırmandaki sorun yazım formatında olabilir karakter dizisi formatında yazırıyorsan dizini \0 ile sonlandırman gerekiyor.
mr_c, yukarida soylediklerine karsi konustuk. Hatanin olusmasi icin '\0' ile ilgili bir durum yok (buna sen de katiliyorsun), ve programcinin "yazdirmasi" gerekmiyor. Tek basina, su ifade hatalidir:
char a = "Merhaba"[10];
Cunku "Merhaba"da 10 ile tanimlanan bir oge yok.
Ali
a bir karakter olmak üzere ;
Yazdırmandaki sorun yazım formatında olabilir , karakter dizisi formatında yazırıyorsan dizini \0 ile sonlandırman gerekiyor. Okuduğun karakteri dizi formatında yazdırıyor olmayasın.
printf("%s\n",a); şeklinde mesela bu durumda karakterin sonunda 0 olmadığından program çökebilir...
acehreli bey e saygılarımla açıklayamadığım için özür dilerim.
Tek basina, su ifade hatalidir:
char a = "Merhaba"[10];
Cunku "Merhaba"da 10 ile tanimlanan bir oge yok.
Ali
C bu konuda şikayet etmez taşma kontrolü yapmaz yani, mantık olarak hatalı evet ama, bahsettikleri taşma hatasının oluşumunun alernatiflerini değerlendiriyordum. Olanı siz söylediniz ama taşmanın nedenlerini değil.
acehreli
21/05/2007, 21:54
Ah! Sonunda anladim... :) Ama programin hatasi zaten [10] erisiminde oldugu icin, ve o noktada gocmus olacagini dusundugum icin daha ilerideki hatalari hic aklima bile getirmedim.
Kusura bakma, :(
Ali
acehreli
21/05/2007, 21:56
Ama tasma [10] erisiminde de olabilir: eger "Merhaba", bu programin erisimine acik bir bellek bolgesinin sonuna yakin bir yerdeyse program [10] erisimi o alanin disina rastlayabilir ve program o anda gocebilir.
Ali
Ama tasma [10] erisiminde de olabilir: eger "Merhaba", bu programin erisimine acik bir bellek bolgesinin sonuna yakin bir yerdeyse program [10] erisimi o alanin disina rastlayabilir ve program o anda gocebilir.
Ali
Evet bunda da hemfikiriz, ihtimal olarak değerlendirmek için arkadaşımızın nasıl yazdırdığını da görmemiz lazım ;)
12 denememde de ilk örneği çökertemedim ama verdiğim kodla çöktü tabi belleğin %99 doldurup denemedim.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.