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
这又是为什么呢?
Debug 和Release的区别
Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。
Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。
那么为什么会出现死循环呢?
分析: 依本题的意思 ,是要输出arr数组里的所有元素,for循环里当i变为12之后,在执行下一步时,i = 0,arr[12] = 0;两者同时变为0(图3),我们取i与arr[10]的地址发现两者地址相同(图4),
i 与 arr 在main函数里,属于局部变量,在栈中开辟空间 一般原则:
栈空间先使用高地址空间 在使用低地址空间
而数组是以下标的形式 从0开始 地址依次递增的开辟空间 图5
因此只要越界的空间大小合适,就有可能出现死循环,那么既然是死循环 ,为什么编译器没有报错?编译器 忙于死循环 没时间 报错
图3
图4
图5