因高低地址而造成的,越界访问后的死循环

目录

 有趣的代码

区别

探究

知识点

解答

总结


 有趣的代码

(我们故意让数组越界访问)

(以下代码均在vs2022的x86环境中运行,x64不会死循环)

代码1:

#include <stdio.h> 

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;
		printf("hehe\n");
	}

	return 0;
}

结果:陷入了死循环

代码2:

#include <stdio.h> 

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;

	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}

	return 0;
}

结果:打印了12次

区别

代码1:


代码2:

探究

知识点

知识1:

局部数据(如:局部变量或局部数组),放在内存的栈区

知识2:

栈区内存的使用习惯是:

先使用高地址处的空间,

再使用低地址处的空间。 

知识3:

数组随着下标的增长,地址由低到高变化  


解答

所以在内存中,代码1

 


调试后可知,arr[12]的地址就是 i 的地址

在此代码中,因为arr[12]被改,i 也被改


只要 i 和 arr 之间有适当的空间,越界往后访问,就有可能访问到 i

总结

如果 i 和 arr 之间有适当的空间 ,利用数组的越界操作就可能会覆盖的 i ,就可能会导致死循环的出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值