数组越界,栈与堆问题

一.数组越界的经典案列
我们先来看一段代码:

#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

猜你喜欢

转载自blog.csdn.net/weixin_42224577/article/details/108300704
今日推荐