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