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 低地址 |