C++数组内存操作疑问:为何arr[2]变为6553600?
C++数组越界修改后的输出成因分析
代码示例
#include <iostream> using namespace std; int main() { int arr[10] = { 0 }; ((char*)&arr)[10] = 100; for (int i = 0; i < 10; i++) { cout << arr[i] << " "; } cout << endl; return 0; }
实际输出
0 0 6553600 0 0 0 0 0 0 0
疑问
为何会出现此输出?具体是在何处修改了arr[2]的值?
核心原因:内存布局与字节级越界修改
要搞懂这个问题,得先明确两个前提:
- 当前环境下
int是4字节(主流x86/x86_64系统的标准配置) - 数组在内存中是连续存储的,
arr的10个int元素会依次排列,每个元素占4字节。
我们来拆解内存地址的对应关系:
arr[0]占用从&arr开始的第0-3字节arr[1]占用第4-7字节arr[2]占用第8-11字节
你写的((char*)&arr)[10] = 100;是把数组起始地址强转为char*(单字节指针),然后修改第10个字节的内容为100。而第10字节正好落在arr[2]的内存区间里(arr[2]的第3个字节,索引从0计数)。
再看数值计算:
- 主流系统都是小端字节序,即低位字节存在内存低地址,高位字节存在内存高地址。
arr[2]原本全为0,现在它的第2个高位字节(对应2^16的权重)被设为100。- 计算得:100 × 2^16 = 100 × 65536 = 6553600,和输出结果完全匹配。
说白了,你以为是修改了数组外的内存,但这个越界的字节刚好属于arr[2]的内存块,所以直接篡改了arr[2]的值。
内容的提问来源于stack exchange,提问作者thedrooster
相关产品推荐
相关产品推荐

