1.栈区问题:
解释以下代码为什么在vs2022里面会变为死循环?
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int i = 0;
system("pause");
for (i = 0; i <= 15; i++)
{
printf("hehe\n");
arr[i] = 0;
}
return 0;
}
该代码为非法访问了6次,这本身就出现了错误,但又为什么非访问了还变为了死循环呢?
那么为了解决疑惑我们看一下代码,
你看画红线的地方俩者的地址为一样也就是说arr[15]就是i,那么在越界访问的时候就会越界到
arr【15】,然后改变arr【15】的值从而改变i的值导致死循环。
通俗的解释也就是如上,(不同编译器i对应的地址不同,只是vs2022恰巧对应的为15,vs2019的为12),那么怎么用官方的话解释呢?
栈区内存的使⽤习惯是从低地址向 高地址使⽤的,所以变量i的地址是 较⼤的。arr数组的地址整体是⼩ 于i的地址。
注意:栈区的默认的使⽤习惯是先使⽤⾼地址,再使⽤低地址的空间,但是这个具体还是要编译器的 实现,⽐如:vs2022栈区的默认使用先使用低地址的空间;后使用高地址的空间;随着数组的下标增加,地址由低到高进行访问,当越界非法访问到arr【15】时恰巧访问的为i的地址,进行arr[i]=0的操作就会使得变为死循环;
在VS上切换到X64,这个使⽤的顺序就是相反的,在Release版本的程序中,这个使⽤的顺序也是相反 的
但是在vs2019里面
以下代码为死循环,上面的不是死循环
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
system("pause");
for (i = 0; i <= 15; i++)
{
printf("hehe\n");
arr[i] = 0;
}
return 0;
}
原因就是