在这种特定情况下,为什么要进入无限循环实际上很容易理解,请查看堆栈中的地址:
int main( )
{
int x = 0;
int i;
int array[5];
printf("&x = %#x, &i = %#x, array = %#x, array+4 = %#x\n", &x, &i, array, array+4);
结果printf()
将显示变量的地址以及数组的开始和结束:
&x = 0xbfac9cec, &i = 0xbfac9ce8, array = 0xbfac9cd4, array+4 = 0xbfac9ce4
所以按顺序,你的堆栈看起来像:
var address
***********************
array[0] 0xbfac9cd4
array[1] 0xbfac9cd8
array[2] 0xbfac9cdc
array[3] 0xbfac9ce0
array[4] 0xbfac9ce4
i 0xbfac9ce8
x 0xbfac9cec
现在您的循环正在写入 0-5(6 个元素),数组中只有 5 个元素,因此写入第 6 个元素实际上会覆盖堆栈中的下一个元素,i
在这种情况下。这使得这条线:
array[i]=x;
和写这个一样:
i = x;
这会将 0(在您的情况下)存储到 i,然后重新启动循环,因此您将看到它永远循环并打印“0 存储到索引 0”,然后打印“索引 1”、2、3、4 然后重新启动当你再次设置i=x;