为什么在C语言中二维数组第二维下标可以越界?

例如:void main(){ int a[3][3]={1,2,3,4,5,6,7,8,9}; printf("%d ",a[0][3]);}
2024-11-19 19:51:24
推荐回答(5个)
回答1:

不是能越界,C中数组时从0开始算起的。你是a[3][3],想要显示对应元素时,就应做相应变换,例如显示第2行第3列元素(即6),就要写printf("%d ",a[1][2]);,你写a[0][3]按照3维数组来说,没有这个元素,这时C语言内的编译器就自动把这个三维数组默认成一个一维数组,他显示的是这个以为数组的第4个数,即4

回答2:

假设这个数组是连续内存的话,第二个下标越界第一个不越界,那这个地址还是有可能落在这个二维数组的内存范围内的,但是你第一维最后元素的第二维下标越界试试? 那就跑出这个数组的内存范围了,谁这么明确告诉你可以越界了?
int a[5][5];
a[5][6]=0;
这么写或许编译不报错,但是你修改了莫名其妙地址上的数据,要么崩溃要么出错...这样是不可取的

回答3:

越界是肯定的,但是越界不代表程序会出错,你这个地方越界后访问的正好是下一个元素4,是一个有效值,所以不会出错。可以试试访问a[3][3],这个时候不一定会访问到什么东西,这时就很容易出现内存破坏,会提示内存不可访问之类的吧

回答4:

因为数组是连续存储的,所以a[0][3]就是第四个存储的数据,你可以试试a[0][4]..

回答5:

相当于一维数组的第四个元素
哥们,往大了试,a[0][9]你试试