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
相关产品推荐
相关产品推荐

