C陷阱与缺陷

C陷阱与缺陷

1.如下代码:(编译环境vs08版)

# include<stdio.h>
# include<string.h>
# include<windows.h>

int main()
{
    int i = 0;
    int arr[10] ={1,2,3,4,5,6,7,8,9,10} ;
   // printf("%p\n",&i);
   // printf("%p\n",arr);
    
    for(i = 0; i< 12; i ++)
    {
        arr[i] = 0;
        printf("hehe\n");
        
        
    }
    system("pause");
    return 0; 
}

运行结果:

Debug下

在这里插入图片描述
图1

结果为死循环,But why?
稍后分析,先往下看

Release 下:

在这里插入图片描述
图2
这又是为什么呢?

DebugRelease的区别

Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。

Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。

那么为什么会出现死循环呢?

分析: 依本题的意思 ,是要输出arr数组里的所有元素,for循环当i变为12之后,在执行下一步时i = 0arr[12] = 0;两者同时变为0图3),我们i与arr[10]的地址发现两者地址相同(图4)

i 与 arr 在main函数里,属于局部变量,栈中开辟空间 一般原则:
栈空间使用高地址空间 使用低地址空间

而数组是以下标的形式 从0开始 地址依次递增的开辟空间 图5
因此只要越界的空间大小合适,就有可能出现死循环,那么既然是死循环 ,为什么编译器没有报错?编译器 忙于死循环 没时间 报错

在这里插入图片描述

​ 图3

在这里插入图片描述

​ 图4

在这里插入图片描述
​ 图5

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值