2

可能重复:
C 中的负数组索引?

这怎么编译,并按预期运行?我很困惑。我只是好奇会发生什么,令我惊讶。有效。

#include <stdio.h>
#include <conio.h>
int main(void)
{
    int i;
    int array[5];
    for(i = -1; i > -6; i--)
        array[i] = i*-1;
    for(i = -1; i > -6; i--)
        printf("%d\n",array[i]);
    getch();
}
4

3 回答 3

6

它起作用了,因为你不走运。不确定应该发生什么。

array[x] 

相当于

*(array+x)

所以你基本上是在取消引用.x之后位置的指针array。在您的情况下,x是负数,因此您在数组之前访问内存。它不能保证工作。

它编译的事实是自然的,它是有效的语法,它是一个格式良好的程序。编译器不需要生成任何诊断(但它可能)。

于 2012-09-27T08:14:28.290 回答
2

它有效,但这只是运气。

数组是一个指针,当您声明它时,它会分配一些内存(例如从位置 1 到位置 6)。然后数组指向第一个元素。当您增加索引时,ti 会将指针向前移动。

在您的情况下,您将指针移动到错误的一侧。但是 C 根本不关心它,而是将它的数据写入该内存块上。然后它能够​​检索该数据。

请小心,因为当您从未为您的程序分配的内存块中读取时,一切都可能发生。这并不意味着会发生错误,但它可以。所以,避免它。

将其视为犯罪。这并不意味着你会被捕,但有风险。

于 2012-09-27T08:16:56.750 回答
0

C 不为数组提供任何边界检查。因此,您只需写入内存并稍后读取即可。由于这部分内存在这段时间内没有被触及,因此您找到了预期值。

于 2012-09-27T08:15:01.343 回答