解释输出(C中的二维数组)

解释输出(C中的二维数组),c,multidimensional-array,C,Multidimensional Array,我编写的代码如下: #include<stdio.h> int main() { int arr[3][2]={{1,2},{3,4},{5,6}}; printf("%d %d %d",arr[0][3],arr[1][2],arr[2][0]); return 0; } 请解释这个输出。根据我的方法,代码应该抛出一个错误,因为没有索引为3或2的列。在C中,如果访问超出数组边界,则不能保证抛出一个错误。事实上,C标准

我编写的代码如下:

#include<stdio.h>
    int main() {
        int arr[3][2]={{1,2},{3,4},{5,6}};
        printf("%d %d %d",arr[0][3],arr[1][2],arr[2][0]);
        return 0;
    }

请解释这个输出。根据我的方法,代码应该抛出一个错误,因为没有索引为3或2的列。

在C中,如果访问超出数组边界,则不能保证抛出一个错误。事实上,C标准对编译器在这种情况下必须做什么没有任何要求。这样做的原因是,编译器可以为法律程序生成最佳的输出,而不必担心阻止您攻击自己。

这是有缺陷的代码。您的数组边界超出范围。然而,它们显然仍然参考真实数据。如果您有一个多维数组arr[NUMROWS][NUMCOLS],则该数组仍连续存储在内存中。要访问元素arr[x][y],则需要在位置x*NUMCOLS+y中查找该元素。对于您的问题,arr作为1 2 3 4 5 6存在于内存中。arr[0][3]指的是索引为0*2+3的元素,即4个数组的索引为0。类似地,arr[1][2]对应于1*2+2=4,即5。最后,arr[2][0]=2*2+0=4,所以你又得到了5。

这是未定义的行为。你可以期望得到任何结果。如果有人解释为什么我在我的问题上得到了-3,那会很有帮助:/。我想我没有违反任何规定。
4 5 5