首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

新奇的循环

2013-01-22 
奇妙的循环#includestdio.hvoid foo(){int iint array[4]for(i0i4i++){array[i]0}}int main(){

奇妙的循环
#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

热点排行