您的位置:首页 > 编程语言 > C语言/C++

for循环 数组下标越界导致死循环

2015-11-29 15:27 871 查看





如图所示函数,最终for语句会陷入死循环,无法结束。

原因在于:堆栈帧中 a[0]~ a[4] 之后是 i 而 访问a[5]时,其地址也是 i所在的地址
因此当你给a[5]赋值为0的时候,也就给 i 赋值为 0 了。
这个问题的原因就是C在编译的时候,不会对数组下标溢出做检查。
因此以后用类似这样的语句时,一定要注意控制数组下标,不要溢出了。
-----------------------------------------------------------

其汇编代码如下:



·······
······
····
···
···
··
··
·
然而并不能看懂。

------------------------------------------------------

所以用printf函数显示每个变量所在的内存地址



然后执行
结果如下:



每个变量的地址都打印出来,能看出,i的地址确实与a[4] + 4 (即a[5])重复了

-----------------------------------------------------------------------------
【总结】
一开始定义a[5]的时候,内存中为数组a开辟了5个内存空间,
第六个放的是i,地址和a[5](假如有a[5])的话 重复了
因此a[5] = 0 这句表达式 等价于 i = 0;
因此陷入死循环。

-----------------------------------------------------------------
【继续深入】
但是如果修改一下一开始变量定义的顺序



那么出来的结果为:



不过要注意,访问了没有定义的数组元素a[5]
这样的代码肯定是有问题的,只不过输出显示暂时是正常的了。
或者,再定义几个无关变量,



结果为



···
···
···
···
将那几个无关变量的地址打印出来
这时候会发现 变量 apple 的地址与 a[5](如果有的话) 重了。
而函数中定义apple的位置恰好在定义a[5]的语句的上面。
看来编译器在进行编译的时候,变量在内存中的存储位置,是按照定义的顺序存放的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息