2016-03-21 10 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 "、...)'は 'NULL 'にセグメンテーションする' puts'に変換されますが、 'printf("。%s \ n "、...)'は'NULL'を'(null) 'に変換する実際の' printf'関数です。 – Cornstalks

+2

奇妙なことや悪いことをやめ、奇妙なことが起こるのをやめます。 –

答えて

0

生成されたアセンブリコードを見ると、printf ("%s\n",…)putsの呼び出しでoptimized by the compilerになっていますが、他の形式の文字列はこのトリックには適していません。

printf関数は、ヌルポインターを検出してクラッシュすることはありませんが、puts関数はそうではありません。

区別はありません。%sの場合、NULLポインタをprintfに渡すことは未定義の動作です。特定のコンパイルプラットフォームで2度目の運があったとしても、それはこれまでどおりです。

+0

この回答は重複した回答のコピーです。重複して終了し、これに答えてください。 – SergeyA

+0

@SergeyA私は英語があなたの母国語ではないと主張しています。私の答えが既に他のところにある同じ情報を述べているからです。 –

+0

私は何もあなたを非難するつもりはなかった、私はちょうどそれが同じ詳細の複製であることを述べた。 SOは、それに答えるのではなく、複製の複製を促進します。 – SergeyA

関連する問題