函数的递归经典问题剖析(为什么越界会导致无限循环)+vs调试教程+关于越界问题的解释和函数栈联系

先上来一段问题代码

这里运行程序,会发现结果不是那么回事,这里是一个经典的越界访问的问题,下面我们就这个问题展开解释。

——————————————————————————————————————————————————————————————————————————————————————

原理解释

这个时候我们可以打开vs 把代码放入到vs里面 此时,我们先运行一遍,发现死循环。首先我们可以了解到,for循环里面的i的数值是大于数组的数值的,这就是经典的越界访问的问题。

越界访问:简单的解释就是越界就像没有栓绳的危险的物,是具备伤害性的,为什么越界会导致死循环的问题发生,这里涉及到函数栈的问题。

——————————————————————————————————————————————————————————————————————————————————————

vs调试简单说明

调试最常使用的几个快捷键
F9:创建断点和取消断点
断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执行,接下来我们就可以使用F10,F11这些快捷键,观察代码的执行细节。
条件断点:满足这个条件,才触发断点
F5:启动调试,经常用来直接跳到下一个断点处,一般是 和F9配合使用。
F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。在函数调用的地方,想进入函数观察细节,必须使用F11,如果使用F10,直接完成函数调用。
CTRL+F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。VS更多快捷键了解: http://blog.csdn.net/mrlisky/article/details/72622009

——————————————————————————————————————————————————————————————————————————————————————

进入vs调试

点击F5

这里我们进入监视 和内存阶段

这里需要注意的是vs的监视阶段 只有进行运行阶段才能显示 如图

 点击F5之后就变成

 下面就进入监视阶段 监视就是输入你需要观察的数值 然后进行观察数组的变化

——————————————————————————————————————————————————————————————————————————————————————

问题代码的剖析

此时是初始的时候 接下里我们进行调试 对arr和i进行监视

这里可以看到 随着程序的运行 逐步 初始化数组

当吧所有的数组初始化后

此时发现 数组依旧进行初始化

1.此时我们发现其中一个问题就是 越界了

此时我们可以发现问题 就是这里不仅一直进行初始化 而且 就地址方面而言 i的地址 和arr的地址是一样的了变成

这里我们画图做出解释

为什么i的地址和arr的地址是一样的

我们可以知道 这个是函数栈的问题

首先我们解释一下 这里需要知道的是 不同的编译器的函数 设置的空间是不一样的

关于这个函数栈以及问题的总结

1.这里的环境是vs2022 x86的环境 64的环境不会产生这种情况

2.不同的编译器的环境不一样的 ,越界的时候会导致完成当前数组之后,继续向上,从而触碰到底层

3.需要知道,函数调用的时候 ,任何时候都是先开辟空间的,开辟,根据开辟的空间进行运行代码。

总结

for循环中,i的内容是从0,一直增加到12,而数组只有10个空间,因此会越界
每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而位     置恰好为i的位置,即a[12]恰巧将i设置为0,因此造成死循环。

——————————————————————————————————————————————————————————————————————————————————————

关于debug的环境和release的环境的区别 

就是release的环境的i不在上面,之前在vs调试里面 写过如果总是出现链接性错误应该怎么处理,没有解释这两个的区别,这里就这个问题进行说明,主要的区别就是因为函数栈,在release的环境里面,vs编译器不仅对代码自主的进行优化而且,i数值不在上面,而是下面,所以导致为什么有时候换成调试状态就好使 解决链接问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值