拥有一个 3x3 2d 数组并访问 array[1][3] 等于 array[2][0]?我用的是C

问题描述 投票:0回答:1

所以基本上,我在我们的课堂上遇到过这段代码

#include <stdio.h>

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]);
}

我有点困惑,因为最后一个 printf 语句是

arr[0][2 + 1]
,它相当于
arr[0][3]
,但由于我们的数组维度是 3x3,所以这使得我们的最大索引值只有 2,使得
arr[0][3]
超出范围。但是当我运行这个东西时,它显示4,与第二条printf语句相同,即
arr[1][0]
,为什么会发生这种情况?

我期待类似错误的信息,它会告诉我它超出了范围,但它继续打印数组的下一个索引值。

arrays c multidimensional-array
1个回答
0
投票

C 不对数组执行任何类型的边界检查。这就是它变得快速的部分原因。然而,这也意味着,如果您做了不应该做的事情,那么您的代码最终会触发未定义的行为

在这种情况下,

arr[0][2 + 1]
超出了第二个数组元素的范围,并且访问越界数组是未定义的行为。在二维(和更大)数组的情况下,每个子数组彼此相连。所以你最终读到了下一个内存位置中发生的内容,该位置恰好是
arr[1][0]

但是,并不能保证您所看到的总会发生。编译器在优化过程中会假设不存在未定义的行为,并根据该假设做出优化决策。

© www.soinside.com 2019 - 2024. All rights reserved.