一道 2016 年 nice 的笔试题引发的思考
上一篇文章的问题代码,我认为有必要单独拿出来讲讲!
一个有问题的代码
复制代码
执行结果:死循环打印 hehe
为了发现问题:打印第几次打印
复制代码
i 不能变为 12
调试结果:
将第数组元素下标为 12 的值也改成 0 时,i 也恢复为 0,所以造成了死循环
**为什么呢?
猜想两个占用同一块空间
->验证
深入理解上述程序 err 原因
栈区先使用高地址,再使用低地址. 先定义变量 i,所以 i 在高地址位置,然后再定义数组,二者相隔几个地址未知
arr 和 i 中隔了几个元素是未知的,取决于编译器
变量和数组相隔距离
复制代码
所以在 VC6.0 条件下,arr[10],写成 i <= 10 时就死循环了
如何解释:
复制代码
问:当 i 和 arr 的创建反过来时:直接报错,不会死循环
因为内存布局发生变化
复制代码
执行结果:报错
注意
程序越界有一个报错的时间点,程序停下来时才报错,死循环了没时间报错
若改成 release 版本:
执行结果:打印 13 个 hehe
在 Debug 情况下: i 确实在数组后面存放, i 的地址比数组地址大
而在 Release 版本:数组的地址更大 编译器进行了优化了,因为考虑到放后面可能出错
这也证明了 Release 版本确实可以优化
今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!
版权声明: 本文为 InfoQ 作者【芒果酱】的原创文章。
原文链接:【http://xie.infoq.cn/article/202bd06df8e978290cb1851eb】。文章转载请联系作者。
评论