数组越界
所谓数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外。程序中经常会遇到数组越界的情况,表现形式一般为读写数据出错、程序崩溃或者无法须知的情况。
#include<stdio.h>
int main()
{
int i;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<=10;i++)
{
arr[i]=0;
printf("%d\n",i);
}
return 0;
}
这个程序在VS会直接崩溃,在GCC环境下,编译运行的结果是个死循环1,2,3,4,5,6,7,8,9,10,1,2,3,···出现这种情况,是由于栈“先进后出”的特点,程序先定义了一个int类型的变量i,接着定义了一个int类型的数组长度为10。在编译器中,内存以栈的数据结构来分配,利用栈“先进后出”的特点,先给i分配了一个4个字节的空间,再给长度为10 的数组分配了40个字节的空间,如下图:
按照栈的分配,数组arr的长度为10,第一个元素是arr[0],最后一个元素是arr[9],在程序循环过程中,10<=10成立,数组越界,这个“越”指的是当前合法位置的下一个,即arr[10]=0则指向了变量i的地址空间并对i赋值为0,从而导致了程序的死循环。