数组下标取值越界主要是指访问数组的时候,下标的取值不在已定义好的数组的取值范围内,而访问的是无法获取的内存地址。例如,对于数组 int a[3],它的下标取值范围是[0,2](即a[0]、a[1] 与 a[2])。如果我们的取值不在这个范围内(如 a[3]),就会发生越界错误。示例代码如下所示:
- 1int a[3];
- 2int i=0;
- 3for(i=0;i<4;i++)
- 4{
- 5 a[i] = i;
- 6}
- 7for(i=0;i<4;i++)
- 8{
- 9 printf("a[%d]=%d\n",i,a[i]);
- 0}
很显然,在上面的示例程序中,访问 a[3] 是非法的,将会发生越界错误。因此,我们应该将上面的代码修改成如下形式:
- 1int a[3];
- 2int i=0;
- 3for(i=0;i<3;i++)
- 4{
- 5 a[i] = i;
- 6}
- 7for(i=0;i<3;i++)
- 8{
- 9 printf("a[%d]=%d\n",i,a[i]);
- 0}
指向数组的指针的指向范围越界
指向数组的指针的指向范围越界是指定义数组时会返回一个指向第一个变量的头指针,对这个指针进行加减运算可以向前或向后移动这个指针,进而访问数组中所有的变量。但在移动指针时,如果不注意移动的次数和位置,会使指针指向数组以外的位置,导致数组发生越界错误。下面的示例代码就是移动指针时没有考虑到移动的次数和数组的范围,从而使程序访问了数组以外的存储单元。
- 1int i;
- 2int *p;
- 3int a[5];
- 4/*数组a的头指针赋值给指针p*/
- 5p=a;
- 6for(i=0;i<10;i++)
- 7{
- 8 /*指针p指向的变量*/
- 9 *p=i+10;
- 10 /*指针p下一个变量*/
- 11 p++;
- 12}
在上面的示例代码中,for 循环会使指针 p 向后移动 10 次,并且每次向指针指向的单元赋值。但是,这里数组 a 的下标取值范围是 [0,4](即 a[0]、a[1]、a[2]、a[3] 与 a[4])。因此,后 5 次的操作会对未知的内存区域赋值,而这种向内存未知区域赋值的操作会使系统发生错误。正确的操作应该是指针移动的次数与数组中的变量个数相同,如下面的代码所示:
- 1int i;
- 2int *p;
- 3int a[5];
- 4/*数组a的头指针赋值给指针p*/
- 5p=a;
- 6for(i=0;i<5;i++)
- 7{
- 8 /*指针p指向的变量*/
- 9 *p=i+10;
- 10 /*指针p下一个变量*/
- 11 p++;
- 12}
为了加深大家对数组越界的了解,下面通过一段完整的数组越界示例来演示编程中数组越界将会导致哪些问题。