首先本文是基于我的C语言调试的保姆级教程而增加的內容,仅起补充叙述作用,请先看完我的C语言调试技巧再来看这个比较好哦,(一定得是我的,别人的可能没有这个內容)
废话不多说,正片开始:
在我的C语言调试技巧中有这样一个代码:
#define _CRT_SECURE_NO_WARNINGS 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;
}
并且告诉你们,一定要改成debug x86的环境
现在阐述为什么:
这里我通过举例的方式进行解答。(由于本人能力原因可能不够详细和专业)
首先我们先对代码进行调整,使之打印i, arr[0], arr[9]的地址以便后面观察
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%p\n", &i);
printf("%p\n", &arr[0]);
printf("%p\n", &arr[9]);
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
一。Debug和Release的差别
将debug换成release,x86不变
程序走起来之后你会发现如下图所示:
由于release有净化,优化代码并且优化观察的作用所以不仅不会陷入死循环,还会打印好几个hehe,再看i,
arr[0], arr[9]的1地址你会发现他们的地址从上到下递增;(这边一定要选一个好观察的地址,可以反复执行,因为每次地址都不一样),这里有人就有疑问了,你上一个博客不是说栈区空间默认是从高地址向低地址打印的吗,怎么这里不一样了?
这里可不是一般情况了
这里就不得不重提一下release的作用
release有净化,优化代码并且优化观察的作用,所以如果i的地址比arr的要高,那一定会陷入死循环的,release为了避免死循环,就会使地址由低到高打印,使之不会死循环,运行的结果也证实了这个结论!!!
二。由于上面这个代码无法在x64下运行,所以我们另起一个代码观察x64和x86的差别
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("%p\n", &a);
printf("%p\n", &b);
return 0;
}
打印a和b的地址,由于代码非常正确,所以debug和release就没有什么显著差别了。
先在x64的环境下打印
然后在x86的环境下打印
你会发现在x64环境下地址的打印是从低到高的,在x86环境下刚好相反,所以只有在x86环境下地址才会从高往低打印,也就进一步解释了为什么死循环只有在 debug,x86环境下才能实现了。