C陷阱与缺陷

C陷阱与缺陷

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

# include
# include
# include

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下

C陷阱与缺陷_第1张图片
图1

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

Release 下:

C陷阱与缺陷_第2张图片
图2
这又是为什么呢?

DebugRelease的区别

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

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

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

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

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

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

C陷阱与缺陷_第3张图片

​ 图3

C陷阱与缺陷_第4张图片

​ 图4

C陷阱与缺陷_第5张图片
​ 图5

你可能感兴趣的:(c)