错误调试分析——自学日常(内存访问错误

先上错误代码

#define _CRT_SECURE_NO_WARNINGS

#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("%d ", i);
	}
	return 0;
}

这个代码的在debug模式下运行会不断地重复输出0~11。
首先这个代码有个很明显的问题,for循环对数组arr的访问越界,那么问题一定是在访问越界的时候发生了什么。
然后我打开了监控窗口,对如下数据进行监控:
在这里插入图片描述
然后我惊奇的发现,在访问越界的arr[12]区域的值和i的值一摸一样,arr[12]会随着i的改变而改变。
那么他们的地址是否相同呢?
在这里插入图片描述
确实,他们的地址也是相同的。
会变成这样的原因,就和程序的数据存储方式有关了,在程序运行中,所有的变量,数组,函数的参数,都会存储在一个名为栈的内存空间中,这个空间的内存地址是由高到低的分配的,就比如在这里,先声明了i,然后再声明arr[10],那么i的地址就比arr大,然后在数组中,地址又是由低到高的排列的,即从arr[1]到arr[10]的地址由小到大,如图
在这里插入图片描述
本来还预留了两个空间防止越界非法访问,结果,arr[12]最终还是访问到了i。
总结,在程序中,一定要注意逻辑,小心非法越界访问!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值