《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的地址顺序不一定