为什么
#include <iostream>
using namespace std;
int main() {
cout << (char*)0x10 << endl;
}
segfault,但
#include <iostream>
using namespace std;
int main() {
cout << (void*)0x10 << endl;
}
似乎工作正常吗?
答案 0 :(得分:8)
由于
cout::operator <<(void*)
打印内存地址,
cout::operator <<(char*)
打印以空字符结尾的字符数组,当您尝试从char
读取0x10
数组时,会遇到未定义的行为。
答案 1 :(得分:3)
ostream::operator<<
被重载,有一个version for char*
将给定指针解释为以空字符结尾的字符串。
答案 2 :(得分:2)
<<
char*
有一个特殊的重载,因此可以轻松输出C风格的字符串。
因此
cout << (char*)0x10 << endl;
尝试打印出位于(char*)0x10
的字符串,该字符串不是它应该查看的内存。