bilibiliclass25_C语言_VS环境-越界访问导致debug死循环,Release没有死循环的原因

《C陷阱和缺陷》笔试题例题1:

Debug死循环
 

#include<atdio.h>
#include<stdlib.h>
int main()
{
    int i=;
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    for(i=0;i<=12;i++)
    {
        printf("hehe\n");
        arr[i]=0;
    }
    //越界访问:死循环原因:&arr[12]和&i相同
    system("pause");
    return 0;    
}

    越界访问是死循环原因:&arr[12]和&i相同
   

内存中的栈区存储局部变量
    1.栈区的默认使用:先使用高地址的空间,再使用低地址的空间
    2.数组随着下标的增长:地址从低到高变化


    栈区:
    高地址——————>低地址
    i(arr[12]) *(arr[11]) *(arr[10]) arr[9] arr[8] arr[7] arr[6] arr[5] arr[4] arr[3] arr[2] arr[1] arr[0]


    不同的编译器的内存布局不一样,所以导致&i==&arr[n]的n值可能不同
    VC6.0 <=10 就死循环
    gcc编译器 <=11 就死循环
    VS2013 <=12 就死循环

Release没有死循环

系统进行代码优化:内存分布的结构都不一样
debug版本i的地址一定比arr的地址高
Release版本:i和arr的地址顺序不一定

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值