先上错误代码
#define _CRT_SECURE_NO_WARNINGS
#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("%d ", i);
}
return 0;
}
这个代码的在debug模式下运行会不断地重复输出0~11。
首先这个代码有个很明显的问题,for循环对数组arr的访问越界,那么问题一定是在访问越界的时候发生了什么。
然后我打开了监控窗口,对如下数据进行监控:
然后我惊奇的发现,在访问越界的arr[12]区域的值和i的值一摸一样,arr[12]会随着i的改变而改变。
那么他们的地址是否相同呢?
确实,他们的地址也是相同的。
会变成这样的原因,就和程序的数据存储方式有关了,在程序运行中,所有的变量,数组,函数的参数,都会存储在一个名为栈的内存空间中,这个空间的内存地址是由高到低的分配的,就比如在这里,先声明了i,然后再声明arr[10],那么i的地址就比arr大,然后在数组中,地址又是由低到高的排列的,即从arr[1]到arr[10]的地址由小到大,如图
本来还预留了两个空间防止越界非法访问,结果,arr[12]最终还是访问到了i。
总结,在程序中,一定要注意逻辑,小心非法越界访问!!!