zoukankan      html  css  js  c++  java
  • 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])来计算出数组中所包含的元素的个数。
    欢迎大家批评、指正。
  • 相关阅读:
    [bzoj3123] [Sdoi2013]森林
    [bzoj2173] 整数的lqp拆分
    Linux
    使用高德地图API
    EF具体用在什么类型的项目上
    出现Data Tools 与VS 不兼容问题
    Entity FramWork
    Entity
    Entity
    BASH
  • 原文地址:https://www.cnblogs.com/zhihaowang/p/10128640.html
Copyright © 2011-2022 走看看