为何无法获取char数组中char元素的内存地址?
为什么输出char类型元素的地址会出现乱码?
现象复现
double类型的正常输出
代码片段:
#include <iostream> class Vector { public: Vector(int vecSize) :elem(new double[vecSize]), size(vecSize) {} double& operator[](int i) { return elem[i]; } int getSize() { return size; } private: double* elem; int size; }; int main() { const int vecSize = 6; Vector myVec(vecSize); for (int i = 0; i < vecSize; i++) { std::cout << &myVec[i] << '\n'; } }
输出结果(正常显示内存地址):
000002336DE2E030 000002336DE2E038 000002336DE2E040 000002336DE2E048 000002336DE2E050 000002336DE2E058
char类型的异常输出
代码片段:
#include <iostream> class Vector { public: Vector(int vecSize) :elem(new char[vecSize]), size(vecSize) {} char& operator[](int i) { return elem[i]; } int getSize() { return size; } private: char* elem; int size; }; int main() { const int vecSize = 6; Vector myVec(vecSize); for (int i = 0; i < vecSize; i++) { std::cout << &myVec[i] << '\n'; } }
输出结果(乱码):
══════²²²² ═════²²²² ════²²²² ═══²²²² ══²²²² ═²²²²
或:
══════²²²²D ═════²²²²D ════²²²²D ═══²²²²D ══²²²²D ═²²²²D
即使添加std::hex也无法解决:
std::cout << std::hex << &myVec[i] << '\n';
原因分析
这是C++标准库中std::ostream(std::cout是其实例)的重载行为差异导致的:
- 对于
double*类型的指针,std::cout会调用通用的指针输出重载,直接将其转换为内存地址的十六进制字符串输出。 - 对于
char*类型的指针,std::cout会调用专门的重载——它把char*视为以\0(空字符)结尾的C风格字符串,会从该地址开始逐个打印字符,直到遇到\0为止。
而你用new char[vecSize]分配的内存是未初始化的,里面填充的是随机的垃圾字节,没有自然的\0终止符。因此std::cout会持续打印这些随机字节,直到在内存中碰巧遇到某个\0,最终就出现了看起来像乱码的输出。
解决方法
要正确输出char类型元素的内存地址,需要避免触发char*的特殊输出重载,方法是将其转换为非字符类型的指针或整数:
方法1:转换为void*
void*的输出重载会直接打印内存地址,不会当作字符串处理:
std::cout << static_cast<void*>(&myVec[i]) << '\n';
方法2:转换为整数类型
可以将指针转换为uintptr_t(无符号整数类型,专门用于存储指针值),再以十六进制输出:
#include <cstdint> // 需要包含该头文件 // ... std::cout << std::hex << reinterpret_cast<uintptr_t>(&myVec[i]) << '\n';
内容的提问来源于stack exchange,提问作者rand_program
相关产品推荐
相关产品推荐

