数组越界那点事儿

C语言中,函数在调用一个数组时,如果局部数组写入产生了越界,则会导致函数的返回地址被覆盖掉,从而破坏调用函数的栈帧。

而数组越界写入就是破坏堆栈的原因有以下两点:

1、入口参数是在栈底(内存高位)附近(函数的返回地址也在附近)

2、数组的存放是从内存低位向高位存放。所以,如果数组大小是4字节,如果越界写入,就会向上破坏相邻高位内存中保存的数据,可能是前面的局部变量,当越界写入内容足够多,就会破坏栈底保存的函数的返回地址,直接导致函数返回时发生崩溃。

例如:

#include<stdio.h>

#include<windows.h>
#include<string.h>
#pragma warning(disable:4996)
/*************************************
局部数组越界会导致函数的返回地址被覆盖掉,
因为局部数组的存储空间在函数的返回地址下面
*****************/
int main()
{
char buf[5];
strcpy(buf, "hello word welcome to shanxi xian everybody");/*被复制粘的字符串长度超过数组长度,
则会覆盖main函数的返回地址*/
printf("%s", buf);
//exit(0);程序正常退出,main函数直接返回,无需地址;
system("pause");
return 0;//不return就不会使用覆盖地址
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值