为什么这会编译,并按预期运行?我糊涂了。我只是好奇会发生什么,令我惊讶。有效。
#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();
}
答案 0 :(得分:6)
这很有效,因为你很不走运。它未定义应该发生什么。
array[x]
相当于
*(array+x)
所以你基本上取消引用x
之后array
位置的指针。在您的情况下,x
为负数,因此您在数组之前访问内存。它不能保证工作。
它编译的事实很自然,它是有效的语法,它是一个结构良好的程序。编译器不需要生成任何诊断(但它可能)。
答案 1 :(得分:2)
它有效,但它只是运气。
数组是一个指针,当你声明它时,它会分配一些内存(例如从位置1到位置6)。然后数组指向第一个元素。当你增加索引时,ti会将指针向前移动。
在您的情况下,您将指针移到错误的一侧。但是C根本不关心它并在那个内存块上写下它的数据。然后它就能检索到这些数据。
要小心,因为当你从一个没有为你的程序分配的内存块中读取时,一切都会发生。这并不意味着会发生错误,但它可以。所以,避免它。
将其视为犯罪行为。这并不意味着你会被捕,但存在风险。
答案 2 :(得分:0)
C不为数组提供任何边界检查。所以你只需要写入内存并稍后阅读。由于这部分内存未被触及,因此您可以找到预期值。