C++打印char类型内存地址出现异常输出,原因是什么?
问题原因与解决办法
为什么会输出乱码?
你打印&givenChar的时候,这个表达式的类型是char*(指向char的指针)。C++里的std::cout对char*有特殊处理逻辑——它会把这个指针当作C风格字符串的起始地址,从该地址开始逐个打印字符,直到碰到字符串结束符'\0'才停止。
但你的givenChar变量后面的内存区域并没有被初始化为合法的C风格字符串(没有'\0'终止符),所以cout会持续读取后续内存中的随机数据,直到碰巧遇到'\0',这就导致了输出乱码。
而其他变量(int、float、double、std::string)的地址是int*、float*这类非char指针类型,std::cout对这类指针没有特殊重载,会默认转换为void*并输出十六进制内存地址,所以显示正常。
解决方法
要正确输出givenChar的内存地址,只需将char*强制转换为void*,让cout按通用指针的规则输出地址:
std::cout << static_cast<void*>(&givenChar) << std::endl;
修改后,&givenChar会输出和其他变量格式一致的十六进制地址,不会再出现乱码。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

