C语言 数组越界(转)

大家都知道,在C语言中一般是不会检查数组的下标范围的,这样的好处是给了程序员很大的灵活性,更宜于写出高效的代码。如果定义一个数组a[n],其有效下标范围为0 - (n-1),但你要引用下标n,编译器一般是不提示错误的,但是这样也潜在的隐含着一些隐患。
请看如下语句:(32位机器上)
#include <stdio.h>
int main(void)
{
    int i;
    int a[3] = {1, 2, 3};
   
    for (i = 1; i <= 3; i++)
    {
        a = 0;
    }
    return(0);
}
现在我们假设计算机分配给变量i内存位置为0022FF5C
数组a中各元素所分配的内存位置如下:
a[0]地址:0022FF50
a[1]地址:0022FF54
a[2]地址:0022FF58
请看for()循环:
i = 1时,把a[1]置0。i自加一次变为2,把a[2]置0。i再自加变为3。
注意了!!!
当i变为3时,程序将找到数组元素a[3]所在的内存位置(即本例中分配给变量i的内存单元0022FF5C),并写入0,从而导致变量i值为0。接着到for()循环中去判断条件 i <= 3,因为i的值刚才被置为0,i <= 3成立,导致再次开始执行循环。
就后程序将陷入死循环。
这就是C中数组不检查下标的一些隐患。但是现在众多的编译器已经对此缺陷做了设计上改良和优化。
平时写一些有关数组的程序时,对数组的元素个数,最好是采取宏定义的方式,比如#define N 10,或是先把元素个数留空(留空时要记得一定要初始化哦),在用到数组元素个数的时候用sizeof方法计算一下就可以了。比如本例子中可以用sizeof(a)/sizeof(a[0])来计算出数组中所包含的元素的个数。
欢迎大家批评、指正。
posted @ 2010-08-07 23:30  thunderhao  阅读(349)  评论(0编辑  收藏  举报