2016-03-21 19 views
1

Ben printf ile oldukça garip bir şey buldum. NULL işaretçisiyle temel printf davranışı

Ben
printf ("%s\n", (char *)NULL); 

aşağıdakileri yapın ben bir segfault olsun. Böyle yapınca

Ama:

printf (".%s\n", (char *)NULL); 

çıktı ve hiçbir çökme altındadır.

.(null) 

Davranış farkının nedenini bilen var mı? Oluşturulan derleme koduna baktığımızda diğer biçim dizeleri bu hile kendilerini ödünç yok oysa

+4

Tanımsız davranışlar, dahil * herhangi bir şeyi * içerebilir. – EOF

+0

[Bu basit yanıt için bu cevabı (bunun bir kopyası olduğunu düşünüyorum)] (http://stackoverflow.com/a/11589443/1287251). Kısa cevap: 'printf ("% s \ n ", ...)' 'NULL'de segfaults olan 'puts'' a dönüştürülür, fakat printf (".% S \ n ", ...)' kullanır "NULL" (null) 'a çeviren asıl' printf 'işlevi. – Cornstalks

+2

Garip/kötü şeyler yapmayı ve garip/kötü şeyler yapmayı durdurun. –

cevap

0

, sen printf ("%s\n",…)puts bir çağrı içine optimized by the compiler olmuştur göreceksiniz.

Platformunuzda, printf işlevi, boş göstericileri algılar ve puts işlevinin yerine getirilmemesini sağlar.

Fark önemli değil: %s için boş göstericiyi printf'a geçirmek için tanımlanmamış bir davranıştır. Hiçbir zaman, eğer kendi derleme platformunda, ikinci kez şanslı olsan bile, hiç yapma.

+0

Bu cevap, yinelenen yanıtın bir kopyasıdır. Yinelenen olarak daha iyi kapatın, sonra buna cevap verin. – SergeyA

+0

@SergeyA İngilizce'nin ana diliniz olmadığını ve gerçekten de bana yanıtımın başka bir yerde zaten var olan aynı bilgileri verdiğinden dolayı gerçekten intihal suçlamadığınızı varsayacağım. –

+0

Seni herhangi bir şeyle suçlamak istemedim, sadece aynı detayın bir kopyası olduğunu söyledim. SO, yanıtları çoğaltmak yerine çoğaltmaları çoğaltır. – SergeyA