c语言二维数组下标负数是什么意思~?

2024年11月22日 19:06
有2个网友回答
网友(1):

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

网友(2):

在这里这不是一个错误,但是一般不会写这样的程序。
首先应该理解语言中数组的存储结构。对二维数组,在内存中实际是按行存储的,也就是说二维数组中元素是按行依次存储在一片连续的的空间中。
取某个元素时,是先通过计算这个元素的地址,再通过计算得来的地址取得该元素的。依然以二维数组为例,设数组a[rows][cols](即有rows行,cols列),当访问a[i][j]的时候,是先通过i,j的值计算得到要取的元素的地址,再在这个地址上取得该值的。计算地址的方法是:
a
+
i*cols
+
j,
这里a就是数组名,它实际存放着上是这个数组的每一个元素的地址。
因此,对于您的问题,
可能计算得到a[2][-2]的元素地址为
a+2*4
+
(-2)
=
a
+
6
=
a
+
1*4
+
2
它的地址与元素a[1][2]的地址一样,也就是说a[2][-2]与a[1][2]实际上是同一个元素。因此输出6,这是正常的现象。