0

我在 c 中编写了以下代码只是为了检查代码是否会中断:

int main(void)
{
    int A [5] [2] [3];
    printf("%d\n\n", A[6]);
    printf("%d\n\n", &A[6][0][0]);
    system("pause");
}

现在,代码没有中断,这是我没想到的。当我们声明一个多维数组:int A [5][2][3]时,这在概念上是否意味着 A 在其第一级是一个由 5 个元素 ( 0 - 4 ) 组成的一维数组,并且该数组的每个元素本身就是一个由 2 个元素组成的一维数组并且该数组的每个元素都是 3 个元素的一维数组?如果这个概念是正确的,那怎么可能 A[6][0][0]存在——因为在第一级我们只有 5 个元素(从 0 开始)。

任何帮助将不胜感激。

4

2 回答 2

5

您正在访问数组外的位置,没有A[6]. 这是未定义的行为,任何事情都可能发生。

请注意,这A[5]是一个定义明确的位置(在数组末尾之后),因此获取指向它的指针是合法的,但尝试访问该指针是不合法的。但是,获取指向A[6]或任何其他更大索引的指针是完全未定义的。

于 2012-05-24T21:32:52.990 回答
0

C 不做数组边界检查。对于int A[4],将其A[5]视为指针算术:*(A + 5)

即使A只用 5 个元素 (0-4) 声明,C 也允许您使用A.

此访问的结果是未定义的。如果你阅读A[5],你可能会得到垃圾;如果你写A[5]ie A[5] = 13,你可能会破坏另一个分配的内存块。

wiki 文章是理解这一点的一个很好的开始,但我建议你拿起一份K&R的副本,阅读它,然后做所有的练习。

于 2012-05-24T21:37:08.300 回答