#include <stdio.h>
void main()
{
int arr[3][2]={2,3,4,5,6,7};
printf("%d\n",arr);
printf("%d\n",arr[1]);
printf("%d",arr[1][2]);
}
在Borland Turbo C ++中编译时的上述代码给出了输出
8682
8686
6
我不明白这个程序是如何运作的。据我所知,在打印arr
时,它返回基址为8682,arr[1]
返回下一个地址位置8686(整数为4个字节)但为什么arr[1][2]
不会像{{1}那样闪烁错误超出界限?
答案 0 :(得分:0)
在C中,超出数组访问不会引发错误 - 事实上它甚至不进行任何检查!相反,系统只会访问内存中发生的任何事情(C程序的主要危险之一)。
以下是对此处发生的事情的解释。在这里使用此代码:
arr[1][2]
内部实际上看起来像这样:
*(arr + 1 * 2 + 2) // the 2 comes from the second dimension size of the array
内部的2D数组存储为一维数组,每行位于前一行之后:
arr[3][2] = {2, 3, 4, 5, 6, 7};
// is the same as
arr[6] = {2, 3, 4, 5, 6, 7};
arr[1][2]
的数学运算可以用来访问arr[5]
,这就是为什么你得6
作为值。
答案 1 :(得分:0)
严格地说,它是未定义的行为。但是,如果你看一下如何处理数组索引,你会发现它为什么起作用。
arr
|
v
+-----+-----+-----+-----+-----+-----+
| 2 | 3 | 4 | 5 | 6 | 7 |
+-----+-----+-----+-----+-----+-----+
arr[0]
|
v
+-----+-----+-----+-----+-----+-----+
| 2 | 3 | 4 | 5 | 6 | 7 |
+-----+-----+-----+-----+-----+-----+
arr[1]
|
v
+-----+-----+-----+-----+-----+-----+
| 2 | 3 | 4 | 5 | 6 | 7 |
+-----+-----+-----+-----+-----+-----+
arr[1][0]
|
v
+-----+-----+-----+-----+-----+-----+
| 2 | 3 | 4 | 5 | 6 | 7 |
+-----+-----+-----+-----+-----+-----+
arr[1][2]
|
v
+-----+-----+-----+-----+-----+-----+
| 2 | 3 | 4 | 5 | 6 | 7 |
+-----+-----+-----+-----+-----+-----+
答案 2 :(得分:0)
为什么arr [1] [2]没有闪烁错误,因为arr [1] [2]超出范围
如果我的记忆对我有用,C不会抱怨数组越界错误。它只会让你走出界限。