我是这么理解的:因为二维数组可以用一维数组的形式访问,int b[3][3]可以理解为有9个int元素的一维数组,二维数组b[0][3]可以理解为一个一维int数组下标为(0x3+3)的int元素,即数组开头后面第4个int-即4,所以没有越界,但如果是b[2][3]就越界了,因为理解为访问一个一维数组下标为(2x3+3)=9,即第10个元素,超出了二维数组共有的9个int元素的范围,所以越界了。
可以用一个简单的代码检验一下:
#include <stdio.h>
int main(void){
int b[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
printf("%d\n",b[0][3]);
//访问数组开头第10个元素,为数组之外的内存了。
printf("%d\n",b[2][3]);
return 0;
}
因为二维数组元素在内存是按行线性排列的,b[0][3] == *((int*)b+0*3+3) == *((int*)b+1*3+0) == b[1][0]