【发布时间】:2025-12-31 02:20:19
【问题描述】:
为什么
#include <iostream>
using namespace std;
int main() {
cout << (char*)0x10 << endl;
}
段错误,但是
#include <iostream>
using namespace std;
int main() {
cout << (void*)0x10 << endl;
}
似乎工作得很好?
【问题讨论】:
为什么
#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*)
打印一个以 null 结尾的字符数组,当您尝试从 0x10 读取 char 数组时遇到未定义的行为。
【讨论】:
ostream::operator<< 被重载,有一个version for char* 将给定指针解释为以空字符结尾的字符串。
【讨论】:
<< 和 char* 有一个特殊的重载,因此可以轻松输出 C 风格的字符串。
这样
cout << (char*)0x10 << endl;
尝试打印出位于(char*)0x10 的字符串,这不是它应该查看的内存。
【讨论】: