我發現printf有點奇怪。具有NULL指針的基本printf行爲
當我做了以下
printf ("%s\n", (char *)NULL);
,我收到了段錯誤。
但是當我這樣做:
printf (".%s\n", (char *)NULL);
輸出低於沒有崩潰。
.(null)
有沒有人知道爲什麼行爲差異?
我發現printf有點奇怪。具有NULL指針的基本printf行爲
當我做了以下
printf ("%s\n", (char *)NULL);
,我收到了段錯誤。
但是當我這樣做:
printf (".%s\n", (char *)NULL);
輸出低於沒有崩潰。
.(null)
有沒有人知道爲什麼行爲差異?
如果你看看生成的彙編代碼,你會發現printf ("%s\n",…)
已被optimized by the compiler調用爲puts
,而其他格式的字符串不適用於這個技巧。
恰巧在您的平臺上,printf
函數檢測到空指針,並避免崩潰,而puts
函數沒有。
區別並不重要:對於%s
,將空指針傳遞給printf
是未定義行爲。即使在您的特定彙編平臺上,第二次您是幸運的,也不要這樣做。
未定義的行爲可以包括* anything *,包括這個。 – EOF
[看到這個答案(對於我認爲這是一個重複的問題)一個非常簡單的解釋](http://stackoverflow.com/a/11589443/1287251)。簡短回答:'printf(「%s \ n」,...)'被轉換爲'puts',其中'default'的段錯誤,但是'printf(「。%s \ n」,...)'使用將'NULL'轉換爲'(null)'的實際'printf'函數。 – Cornstalks
不要做奇怪/不好的事情,奇怪的事情會停止發生。 –