这是如何编译和运行的呢?我很困惑。我只是好奇会发生什么,这让我大吃一惊。啊,真灵。
#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();
}发布于 2012-09-27 08:16:56
很管用,但这只是运气。
数组是一个指针,当您声明它时,它会分配一些内存(例如从位置1到位置6)。然后,数组指向第一个元素。增加索引时,ti将指针向前移动。
在你的例子中,你把指针移到了错误的一边。但是C一点也不关心它,并且把它的数据写在那个内存块上。然后它就能检索到这些数据。
要小心,因为当您从未分配给程序的内存块中读取时,一切都可能发生。这并不意味着会发生一些错误,但它会发生。所以,避开它。
把它想成是犯罪。这并不意味着你会被逮捕,但这有风险。
发布于 2012-09-27 08:14:28
因为你运气不好。应该发生什么还不清楚。
array[x] 等于
*(array+x)因此,您基本上是在取消引用一个指针,即x在array之后的位置。在您的例子中,x是负的,所以在数组之前访问内存。这不一定能起作用。
它编译的事实是自然的,它是有效的语法,是一个格式良好的程序。编译器不需要生成任何诊断信息(但它可能)。
发布于 2012-09-27 08:15:01
C不为数组提供任何边界检查。所以你只需把它写进内存,稍后再读。由于内存的这一部分在这段时间内没有被触及,所以您可以找到预期的值。
https://stackoverflow.com/questions/12616830
复制相似问题