在c++中,char定义的变量取地址时,为什么会输出 “烫烫烫...“?
在 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;