通过局部变量的储存解释越界访问的危害

引入一段错误的代码

int main()
{
	int i = 0;
	int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
	for (i = 0; i < 13; i++)
	{
		a[i] = 0;
		printf("嘻嘻\n");
	}
	
	return 0;
}

看到上面这段代码,我们的第一感觉是越界访问了,毕竟我们只声明了一个长度为10的数组,但是在循环之中它最多可以访问a[12],但是这个程序运行起来到底会是什么样呢?大部分人应该会和笔者一样,觉得会报错或者打印出13个“嘻嘻”,但果真如此吗?

程序最终陷入了死循环,怎么会这样呢?

我们通过调试发现,通过i=10,数组a进行了越界访问。

接下来神奇的事情发生了,当数组a越界访问到a[12]时,居然把i置0了。

这说明a[12]访问的区域是储存i的区域。

下面让我们用图来解释这个问题:

 我们知道局部变量是储存在栈区之中的,储存的区域是从高地址区域到低地址区域,并且数组的储存和调用是从低地址区到高地址区,随着数组调用下标的增长,调用的地址升高。

最终越界之后更改了i的值,使得程序陷入死循环,因为程序无法结束也来不及报错。

大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注

大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JDSZGLLL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值