数组越界可能造成的死循环风险
//数组越界造成的死循环风险
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++) //当小于等于11时会报错,而小于等于12的时候不会,
{ //原因是小于等于12的时候死循环,导致没有机会报错,因为报错是在程序结束后发生的
printf("沉迷学习,无法自拔\n");
arr[i] = 0;
}
return 0;
}
以上程序在debug版本下运行时会出现死循环的情况。原因如下: 该程序在运行时,由于i和arr都属于局部变量,故会在栈区创建,由于i在前,arr在后,且系统栈区是由高到低的,故变量i创建在高地址,数组arr创建在低地址,当数组访问越界且i=12时,arr[12]=0,arr[12]与i在同一空间,故此时i==0,造成死循环。
注意:
(1)在不同的编译器下,数组与变量间的空余空间不同,vs2019下是2个空间。
(2)在release版本下,不会造成死循环,原因是编译器将代码优化时,使变量i创建在数组之后。