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

时间:2012-09-27 08:11:47

标签: c arrays indexing semantics

  

可能重复:
  Negative array indexes in 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();
}

3 个答案:

答案 0 :(得分:6)

这很有效,因为你很不走运。它未定义应该发生什么。

array[x] 

相当于

*(array+x)

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

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

答案 1 :(得分:2)

它有效,但它只是运气。

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

在您的情况下,您将指针移到错误的一侧。但是C根本不关心它并在那个内存块上写下它的数据。然后它就能检索到这些数据。

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

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

答案 2 :(得分:0)

C不为数组提供任何边界检查。所以你只需要写入内存并稍后阅读。由于这部分内存未被触及,因此您可以找到预期值。