简单理解【Debug】与【Realse】,竟然会不报错!!!

2024 - 09 - 18 - 笔记 - 15
作者(Author):仟濹(网名)

开屏暴击 😄Debug 和 Release !!!

  • Debug - 是程序员在写程序的时候用的
  • Releas - 是给测试人员 / 用户 用的
int main()
{
    int i = 0;
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8 ,9, 10 };
    for(i = 0; i < 12; i ++)//在Debug下进行越界访问
    {
   		arr[i] = 0;
        printf("%d\n", i + 1);      
    }
}
在Debug中的结果

在VS2022中会在运行的过程中报错(而不是在编译的时候报错),而在VS2019中则不会在运行中报错,而是一直运行下去,变死循环

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
0//此时i 的值已经被改变,本该在第13次停下
0
0
0
...
...
//无限循环

在Release中的结果

在release中不会死循环

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
0
//总共走了13次
为什么在Debug中i的值会被覆盖,而在Realse中就不会被覆盖???

① 这是在Debug中的内存布局

从低地址往高地址走的时候,一旦越界,就很有可能会导致i被覆盖,因为arr[9]再往上走的时候,会走到i的位置

i 高地址
arr[9] 高地址
arr[8] ^
arr[7] ^
arr[6]
arr[5]
arr[4]
arr[3]
arr[2] ^
arr[1] ^
arr[0] 低地址

② 这是在Release中的布局
Release在VS中对代码进行了优化

i 存到了相对低地址的地方(在数组存放的下面),而数组存在相对高地址的地方。

这样子就有效的避免了 i 被盖住的命运

arr[9] 高地址
arr[8] ^
arr[7] ^
arr[6]
arr[5]
arr[4]
arr[3]
arr[2] ^
arr[1] ^
arr[0] 低地址
i 低地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值