为什么C++中std::cout输出char变量地址时会打印字符本身?
问题原因
std::cout所属的std::ostream类对不同类型的指针重载了不同的operator<<输出逻辑:
- 对于
int*、double*这类非字符类型的指针,operator<<会直接输出指针存储的十六进制内存地址,和你最初测试int变量的结果一致。 - 对于
char*、const char*这类字符指针,operator<<有专属的重载实现,默认会将指针视为C风格字符串的首地址:从指针指向的位置开始逐字节读取字符输出,直到碰到\0(字符串结束标记)才停止输出。
你碰到的两个异常现象都和这个设计有关:
- 仅声明单个
char b = 'x'时输出x:&b的类型是char*,触发了字符串输出逻辑,从b的地址开始第一个字符是x,如果刚好x后紧邻的内存是\0,输出就会停止,最终你只会看到字符x。 - 声明三个连续
char变量时输出xyz:栈上分配的局部char变量通常会按声明顺序连续排布在内存中,从&b的位置开始读会依次拿到x、y、z三个字符,直到后续内存出现\0才停止,所以会输出三个拼接的字符。
需要注意:这种读取超出变量本身内存范围的操作属于未定义行为,输出结果不固定,极端情况可能导致程序崩溃。
解决方案
如果要输出char类型变量的内存地址,只需将char*指针强转为通用指针类型void*,触发地址输出逻辑即可:
char b = 'x'; std::cout << static_cast<void*>(&b) << "\n";
上述代码就会输出你预期的十六进制内存地址。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

