Visual Studio环境下一段有趣的代码
1 | int main() |
观察这段代码,运行会有何效果?
你可能会说,既然越界访问了,那不就报错了?其实不然,运行发现,程序没有报错,一直死循环。
注意:该段代码依赖环境,vs编译器,debug模式,x86平台下才有这样的效果。
为什么陷入了死循环,这要从栈区的使用习惯开始说起。静态变量,函数形参都存放到栈中,而栈是从高地址开始存放。**栈区的使用习惯是先使用高地址处的空间。**我们还知道,**数组随着下标变大,地址是由低到高变化的。**所以上段代码在栈中的内存布局,如下图所示。
vs编译器,debug模式,x86平台下,i和数组arr间刚好空了2个下标的空间。所以i和arr[12]指向了同一块地址,不信我们可以调试看一下i和arr[12]的地址。
当i自增到12,执行arr[12]=0
时,因为共用同一块空间,i也变成了0,0<12,再一次进入了循环,如此往复便陷入了死循环。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 胖虎同学!
评论