栈区的非法访问导致的死循环(x64)

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;
}

原因就是

vs2022和vs2019栈区存放不同 

vs2019栈区内存存放习惯:先放高地址,再放低地址

vs2022栈区内存存放习惯:先放低地址,再放高地址

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值