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

3x3二维数组访问arr[0][3]为何等同于arr[1][0]?

为什么3x3二维数组访问arr[0][3]会输出arr[1][0]的值?

这本质是C语言二维数组的内存存储规则和下标计算逻辑导致的,同时要明确:这种越界访问属于「未定义行为」,只是你的编译器刚好按这个方式处理了,不是所有环境下都会出现相同结果。

1. 二维数组的内存布局

C语言里的二维数组,底层是连续存储的一维数组。你定义的int arr[3][3],在内存中是按行依次排列的,顺序为:
1, 2, 3, 4, 5, 6, 7, 8, 9
每个int类型占4字节(32位系统),整个数组是一块连续的27字节(9×4)内存空间。

2. 下标访问的本质

C语言中arr[i][j]等价于*(arr + i * 列数 + j),这里数组的列数是3。

  • 对于arr[0][3]:计算出的内存偏移量是0×3 + 3 = 3,对应内存中第4个元素(从0开始计数),也就是4。
  • 对于arr[1][0]:偏移量是1×3 + 0 = 3,和上面的偏移量完全一致,指向同一个内存地址,所以输出相同的值。

3. 重点:这是未定义行为

虽然这次运行结果看起来“有规律”,但数组越界访问是C标准明确禁止的未定义行为。编译器没有义务抛出错误,在其他环境下(比如不同编译器、操作系统、优化等级),可能出现程序崩溃、输出垃圾值、篡改其他变量等问题,绝对不能依赖这种行为编写代码。

附测试代码:

#include <stdio.h>

int main() {

    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    printf("%d", arr[0][2]);
    printf("\n%d", arr[1][0]);

    printf("\n%d", arr[0][2 + 1]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:48:14