どして
#include <iostream>
using namespace std;
int main() {
cout << (char*)0x10 << endl;
}
セグメンテーション違反、しかし
#include <iostream>
using namespace std;
int main() {
cout << (void*)0x10 << endl;
}
うまくいくようですか?
なぜなら
cout::operator <<(void*)
メモリアドレスを出力し、
cout::operator <<(char*)
char
nullで終了する文字配列を出力し、から配列を読み取ろうとすると、未定義の動作が発生します0x10
。
はostream::operator<<
オーバーロードされており、指定されたポインタをnullで終了する文字列として解釈するバージョンがあります。char*
<<
withには特別なオーバーロードがchar*
あるため、Cスタイルの文字列を簡単に出力できます。
したがって
cout << (char*)0x10 << endl;
(char*)0x10
表示されるはずのメモリではない場所にある文字列を出力しようとします。