我编写的代码如下:
#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;
}
(GCC)输出是:
4 5 5
请解释此输出。根据我的方法,代码应该抛出一个错误,因为没有列索引为3或2。
答案 0 :(得分:2)
这是有缺陷的代码。你的数组边界超出范围。但是,他们显然仍然参考实际数据。如果您有一个多维数组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 。
答案 1 :(得分:0)
在C中,如果访问数组的边界,则无法保证抛出错误。实际上,C标准没有要求编译器在这种情况下必须做什么。这样做的原因是编译器可以为合法程序生成最佳输出,而不必担心会阻止你在脚下射击。