数组越界访问导致死循环的情况

这个问题是在学习程序地址空间的时候回忆C语言学习时想到的

我们会遇到下面的情况

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;
	}
	return 0;
}

程序死循环了

问题就出在程序的存储空间上,i和arr都是局部变量,都存储在栈空间上的,并且程序对于栈空间的使用是先使用高地址,再使用低地址,所以内存分布图如下
在这里插入图片描述
我们在程序中先定义了 i,所以先为 i 开辟了空间,里面存储的数据是0,然后再为数组arr开辟空间,并且对于数组越界的检查并没有太严格,这里我们循环这个数组,去访问到了arr[10]、arr[11]、arr[12]的空间,并分别对其赋值为0,由于栈空间的“生长方向”是先使用高地址,再使用低地址,所以在我们访问arr[12]时,就同时访问到了 i 的空间,并将其赋值为0,此时 i 从12变成了0,又继续循环下去

这种情况比较特殊,是否会触发,还需要看编译器检查的脸色,所以还得多调试看内存空间的存储情况

这里没有报错的原因可以简单理解为当前CPU正在执行这个循环,只要这个循环还没有结束,CPU就不会去检查越界的问题,如果当我们的循环结束后,才会去检查刚刚是否有越界访问的情况(通过测试,如果只是"读",没有写入,越界了也不会报错,越界写,就会报错,但是去读一个我们程序未定义的内存空间,是没有任何意义,并且风险很大的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

失去梦想的小草

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

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

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

打赏作者

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

抵扣说明:

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

余额充值