奇妙的循环
#include<stdio.h>
void foo()
{
int i;
int array[4];
for(i=0;i<=4;i++)
{
array[i]=0;
}
}
int main()
{
foo();
return 0;
}
请哪位懂的讲解一下,这个函数内部怎么就变成一个死循环了?谢谢!
[解决办法]
VC?
若使用VC, 而且还是Debug版本,那就是因为这个
Debug的数组木有边界检查,数组越界后,array[4]访问谁?答案是 j,因为j的空间和array的空间连到一起了
[解决办法]
越界导致写[4]的时候可能会覆盖了变量i的内容,导致i变为0.
Run-Time Check Failure #2 - Stack around the variable 'array' was corrupted.我测试就没有死循环了。
[解决办法]
主要是由于编译器地址空间分配的缘故。
在内存中地址分配如下:
高地址
[解决办法]
i
[解决办法]
a[4]
[解决办法]
a[3]
[解决办法]
a[2]
[解决办法]
a[1]
[解决办法]
a[0]
[解决办法]
低地址
数组地址逐渐增加,越界刚好更改了i的值。
虽然有些编译器做了优化,使数组和i之间留有内存间隙,但是,如果i越界严重,比如不小心给了50,还是会导致死循环。
[解决办法]
棧地址從高向低增長,
array[4]数组越界,正好訪問到i,
所以array[4] = 0;就使得i=0;
[解决办法]
看栈的增长方向喽,,常用OS中栈是往低地址长,,a[4]刚好是i