2016-03-21 44 views
1

我發現printf有點奇怪。具有NULL指針的基本printf行爲

當我做了以下

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

,我收到了段錯誤。

但是當我這樣做:

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

輸出低於沒有崩潰。

.(null) 

有沒有人知道爲什麼行爲差異?

+4

未定義的行爲可以包括* anything *,包括這個。 – EOF

+0

[看到這個答案(對於我認爲這是一個重複的問題)一個非常簡單的解釋](http://stackoverflow.com/a/11589443/1287251)。簡短回答:'printf(「%s \ n」,...)'被轉換爲'puts',其中'default'的段錯誤,但是'printf(「。%s \ n」,...)'使用將'NULL'轉換爲'(null)'的實際'printf'函數。 – Cornstalks

+2

不要做奇怪/不好的事情,奇怪的事情會停止發生。 –

回答

0

如果你看看生成的彙編代碼,你會發現printf ("%s\n",…)已被optimized by the compiler調用爲puts,而其他格式的字符串不適用於這個技巧。

恰巧在您的平臺上,printf函數檢測到空指針,並避免崩潰,而puts函數沒有。

區別並不重要:對於%s,將空指針傳遞給printf是未定義行爲。即使在您的特定彙編平臺上,第二次您是幸運的,也不要這樣做。

+0

此答案是重複答案的副本。更好地接近重複然後回答這個問題。 – SergeyA

+0

@SergeyA我會假設英語不是你的母語,並且你並沒有真正地指責我剽竊,只是因爲我的回答陳述了其他地方已經存在的相同信息。 –

+0

我不是故意指責你什麼,我只是提到它是相同細節的重複。 SO促進closig重複,而不是回答它們。 – SergeyA