为什么带有负索引的数组有效?

Hoo*_*lum 2 c arrays indexing semantics

可能重复:
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();
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 6

它很有用,因为你很不走运.它未定义应该发生什么.

array[x] 
Run Code Online (Sandbox Code Playgroud)

相当于

*(array+x)
Run Code Online (Sandbox Code Playgroud)

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

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