Debug和Release的介绍
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
一个十六进制数字代表四个二进制位,因为2的4次方等于16,所以4个二进制位才能达到表示16的大小。
vs里面的调用堆栈显示的是函数的调用逻辑。
调试的经典案例:1!+2!+3!+……
通过调试我们可以发现在j=3的时候进入循环时,ret的值仍为2,没有置成1,这是导致错误的直接原因。
调试时要有预期——知道应该是什么结果,调试时发现结果不符合预期就找到问题所在了
如果按正常来说,指针肯定是越界访问了,运行会出现崩溃的现象,但是在这里却出现了死循环,下面我们来一起分析原因:
这是一个经典的调试案例,通过调试我们可以发现,在i=15时,arr[i]被置成了arr[1],在i>10后本来应该报错,但由于后来arr[i]被置成arr[1]代码由此无限运行,陷入死循环,没有报错的机会,可以一直进行循环。
通过分别打印变量i和arr[15]的地址我们发现二者的地址相同。
i和arr是局部变量,局部变量是放在栈区上的,栈区的使用习惯是:先使用高地址,再使用低地址
数组随着下标的增长,地址是由低到高变化的。
但是如果我们把Debug改为release版本时,代码却可以正常运行,因为release版本对程序进行了优化,release版本把变量i的地址放在了数组地址的下方,这样一来,指针越界也永远越界不到i的地址上,也由此不会发生死循环。