在 C++ 中,当你直接输出 char* 指针(比如 &b)时,std::cout 会将其视为 C 风格字符串(即以 '\0' 结尾的字符数组),而不是内存地址。因此,它会尝试从 b 的地址开始读取内存,直到遇到 '\0' 为止,但由于 b 只是一个单独的 char,后面的内存内容是未初始化的(可能是垃圾值),所以会输出乱码(如 “烫烫烫…”)。
为什么会输出 “烫烫烫…”?
-
&b被当作字符串处理
std::cout对char*有特殊处理,会把它当作字符串的起始地址,并尝试打印直到'\0'结束。但由于b只是一个字节,后面的内存可能是随机数据,导致乱码。 -
“烫烫烫…” 的由来
- 在 Windows 的 Debug 模式下,未初始化的栈内存通常会被填充为
0xCC(MSVC 编译器的调试模式行为)。 0xCC在 GBK 编码下对应汉字 “烫”,所以连续输出多个0xCC就会显示为 “烫烫烫…”。
- 在 Windows 的 Debug 模式下,未初始化的栈内存通常会被填充为
如何正确输出 char 变量的地址?
如果你想输出 char 变量的 内存地址,而不是把它当作字符串,你需要将 &b 强制转换为 void*:
char b;
std::cout << "变量 b 的地址:" << static_cast<void*>(&b) << std::endl;
或者:
std::cout << "变量 b 的地址:" << (void*)&b << std::endl;
这样 std::cout 就不会把它当作字符串,而是直接输出指针的地址值。
示例代码
#include <iostream>
int main() {
char b;
std::cout << "错误的输出方式(当作字符串处理): " << &b << std::endl; // 可能输出乱码
std::cout << "正确的输出方式(强制转为 void*): " << static_cast<void*>(&b) << std::endl; // 输出真实地址
return 0;
}
总结
std::cout对char*特殊处理,会尝试打印字符串,而不是地址。- 未初始化的内存可能包含垃圾值,导致输出乱码(如 “烫烫烫…”)。
- 正确做法是强制转换为
void*,这样std::cout会直接输出地址值。
这样可以避免乱码,正确显示变量的内存地址。
int a;
char b;
bool c;
string d;
std::cout<<"变量a的地址:"<<&a<<std::endl;
std::cout<<"变量b的地址:"<<&b<<std::endl;
std::cout<<"变量c的地址:"<<&c<<std::endl;
std::cout<<"变量d的地址:"<<&d<<std::endl;
std::cout<<"改成================="<<std::endl;
std::cout<<"变量a的地址:"<<(void*)&a<<std::endl;
std::cout<<"变量b的地址:"<<(void*)&b<<std::endl;
std::cout<<"变量c的地址:"<<(void*)&c<<std::endl;
std::cout<<"变量d的地址:"<<(void*)&d<<std::endl;
17万+

被折叠的 条评论
为什么被折叠?



