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

Mingw编译下char数组地址输出异常,为何与int数组表现不同?

为何char数组的地址输出不是预期的十六进制内存地址,而是乱码字符?

问题场景

使用MinGW编译器运行两段C++代码时出现不同输出表现:

第一段代码(char数组)

#include<iostream>
using namespace std;

int main()
{
    char a[5];
    cout << sizeof(a) << endl <<&a[0] << endl <<&a[1] << endl <<&a[2] << endl <<&a[3] << endl <<&a[4] << endl <<&a[5];
    
    return 0;
}

输出类似:

5




@

░→@

第二段代码(int数组)

#include<iostream>
using namespace std;

int main()
{
    int a[5];
    cout << sizeof(a) << endl <<&a[0] << endl <<&a[1] << endl <<&a[2] << endl <<&a[3] << endl <<&a[4] << endl <<&a[5];

    return 0;
}

输出:

20
0x61fefc
0x61ff00
0x61ff04
0x61ff08
0x61ff0c
0x61ff10

疑问:为何char数组的地址输出不是预期的十六进制内存地址,而是乱码字符?这是否属于异常问题?

原因分析

这不是异常问题,是C++标准库std::cout的重载行为导致的:

  • 对于int*类型的指针,cout没有特殊重载,会默认将其转换为void*,然后以十六进制格式输出内存地址。
  • 对于char*类型的指针,cout有专门的重载:它会把char*视为C风格字符串,从指针指向的地址开始输出字符,直到遇到'\0'(空字符)才停止。

你的char数组是未初始化的,内存中是随机值,没有'\0'终止符,所以cout会一直输出内存中的随机字符,直到碰到某个恰好是'\0'的位置,这就出现了所谓的“乱码”。

另外注意:代码中&a[5]属于数组越界访问,数组a[5]的有效索引是0到4,访问a[5]是未定义行为,虽然程序可能没崩溃,但这种写法是错误的,应该避免。

解决方法

如果想输出char数组元素的地址,需要把char*强制转换为void*,这样cout就会以十六进制格式输出地址:

#include<iostream>
using namespace std;

int main()
{
    char a[5];
    cout << sizeof(a) << endl 
         << static_cast<void*>(&a[0]) << endl 
         << static_cast<void*>(&a[1]) << endl 
         << static_cast<void*>(&a[2]) << endl 
         << static_cast<void*>(&a[3]) << endl 
         << static_cast<void*>(&a[4]) << endl;
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Vishesh Rawal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:04:54