【问题标题】:Why do arrays with negative indexes work? [duplicate]为什么具有负索引的数组有效? [复制]
【发布时间】:2012-09-18 23:17:21
【问题描述】:
可能重复:
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();
}
【问题讨论】:
标签:
c
arrays
indexing
semantics
【解决方案1】:
它起作用了,因为你不走运。不确定应该发生什么。
array[x]
等价于
*(array+x)
所以你基本上是在取消引用 x 在 array 之后位置的指针。在您的情况下,x 是负数,因此您在数组之前访问内存。不保证有效。
它编译的事实是自然的,它是有效的语法,它是一个格式良好的程序。编译器不需要生成任何诊断信息(但它可以)。
【解决方案2】:
C 不为数组提供任何边界检查。因此,您只需写入内存并稍后读取即可。由于这部分内存在这段时间内没有被触及,因此您找到了预期值。
【解决方案3】:
它有效,但这只是运气。
数组是一个指针,当你声明它时,它会分配一些内存(例如从位置 1 到位置 6)。然后数组指向第一个元素。当您增加索引时,ti 会将指针向前移动。
在您的情况下,您将指针移到了错误的一侧。但是C根本不关心它,而是将它的数据写入那个内存块。然后它就能够检索该数据。
要小心,因为当您从未为程序分配的内存块中读取数据时,一切都可能发生。这并不意味着会发生错误的事情,但它可以。所以,避免它。
将其视为犯罪。这并不意味着你会被逮捕,但这是有风险的。