一.数组越界的经典案列
我们先来看一段代码:
#include<stdio.h>
int main()
{
int i;
int arr[10];
for(i=0;i<=10;i++)
{
arr[i]=0;
printf("%d\n",arr[i]);
}
return 0;
}
在Linux中的运行结果如下图:
这里打印了11个0而且还显示了栈粉碎错误;
因为栈是从高地址往低地址扩展,也就是先入的数据在高地址,i定义在arr之前,先被压入栈中在高地址,而数组在栈中是从低地址往高地址存储的,也就是a[9]是靠近i的,那么因为最后a[10]超过了数组指向了下一个地址也就是i所以会将i赋值为0,最终i永远超不过10所以,这个循环会无限循环下去,就会出现问题。
整个程序压栈的过程分析:
https://blog.csdn.net/wind19/article/details/5964137
https://blog.csdn.net/wind_waves/article/details/94059086
二.如何避免数组越界
一个是编码的习惯,尽量的显示的表达数组个数;
一个是传参的时候尽量将数组的长度放在参数中;
https://blog.csdn.net/liming0931/article/details/100630876