You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:21:06