Debug和Release,x64和x86的差别解答

首先本文是基于我的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环境下才能实现了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值