目录
有趣的代码
(我们故意让数组越界访问)
(以下代码均在vs2022的x86环境中运行,x64不会死循环)
代码1:
#include <stdio.h> int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
结果:陷入了死循环
代码2:
#include <stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
结果:打印了12次
区别
代码1:
代码2:
探究
知识点
知识1:
局部数据(如:局部变量或局部数组),放在内存的栈区
知识2:
栈区内存的使用习惯是:
先使用高地址处的空间,
再使用低地址处的空间。
知识3:
数组随着下标的增长,地址由低到高变化
解答
所以在内存中,代码1:
调试后可知,arr[12]的地址就是 i 的地址
在此代码中,因为arr[12]被改,i 也被改
只要 i 和 arr 之间有适当的空间,越界往后访问,就有可能访问到 i
总结
如果 i 和 arr 之间有适当的空间 ,利用数组的越界操作就可能会覆盖的 i ,就可能会导致死循环的出现