は?cout
あなたが実行したという理由だけで失敗する理由がわかりません
std::cout << 0 << std::endl;
出力する必要があります0\n
。そして、そうです。話の終わり。
(混乱する場合は、C++ のことを知っておいてください#define NULL (0)
。)
あなたが書いた場合:
T* p = 0;
std::cout << p << std::endl;
次に、アドレスが表示されます0
(通常は 16 進数で、ポインターのサイズに合わせてパディングされます。これは、ポインターを確認するための推奨される方法であるためです)。
(ところで、これは NULL の C 定義を使用して得られる動作です#define NULL ((void*)0)
。)
あなたが書く場合のみ
char* p = 0;
std::cout << p << std::endl;
何か困っていますか。今、あなたは電話しています
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, const char* s);
標準(セクション27.7.3.6.4)は次のように述べています。
Requires : s
null ポインターであってはなりません。
null ポインターを渡した場合は、規則 17.6.4.9 が適用され、次のように規定されています。
次のそれぞれは、特に明記されていない限り、C++ 標準ライブラリで定義されている関数のすべての引数に適用されます。* 関数の引数に無効な値 (関数のドメイン外の値や、意図された使用に対して無効なポインターなど) がある場合、動作は未定義です。
だからあなたは「未定義の振る舞い」の土地にいます。failbit
が設定され、プログラムが続行されるという保証はありません。
printf
動作は実際には のタイプに依存しないことに注意してくださいNULL
。"%s"
文字列 (NUL で終了する文字シーケンスへのポインター) として扱われるようになったのは、フォーマット文字列です。