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

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字节。

我们来拆解内存地址的对应关系:

  1. arr[0]占用从&arr开始的第0-3字节
  2. arr[1]占用第4-7字节
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:06:01