zoukankan      html  css  js  c++  java
  • c语言数组越界的避免方法

    1、尽量显式地指定数组的边界

    #define MAX 10

    int a[MAX]={1,2,3,4,5,6,7,8,9,10};

    在 C99 标准中,还允许我们使用单个指示符为数组的两段“分配”空间,如下面的代码所示:
    int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10};

    在上面的 a[MAX] 数组中,如果 MAX 大于 10,数组中间将用 0 值元素进行填充(填充的个数为 MAX-10,并从 a[5] 开始进行 0 值填充);如果 MAX 小于 10,“[MAX-5]”之前的 5 个元素(1,2,3,4,5)中将有几个被“[MAX-5]”之后的 5 个元素(6,7,8,9,10)所覆盖。

    2、对数组做越界检查,确保索引值位于合法的范围之内
    传递数组参数的时候,一定要带上传入数组的长度,比如:

    void Init(int arr[],size_t arr_len)
    {
        size_t i=0;
        for(i=0;i<arr_len;i++)
        {
            arr[i]=i;
        }
    }


    arr_len类型一定要无符号,避免负数的副作用。
    3、获取数组的长度时不要对指针应用 sizeof 操作符。
    单地讲,sizeof 是一个单目操作符,不是函数。其作用就是返回一个操作数所占的内存字节数
    下面的函数中,使用sizeof,以为是对的,其实,arr传进来的时候,已经退化为指针,所以等同于
    void Init(int *arr)。

    void Init(int arr[])
    {
        size_t i=0;
        for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
        {
            arr[i]=i;
        }
    }

    4、除此之外,我们还可以通过指针的方式来解决上面的问题,示例代码如下所示:

    void Init(int (*arr)[10])
    {
        size_t i=0;
        for(i=0;i< sizeof(*arr)/sizeof(int);i++)
        {
            (*arr)[i]=i;
        }
    }
    int main(void)
    {
        int i=0;
        int a[10];
        Init(&a);
        for(i=0;i<10;i++)
        {
            printf("%d
    ",a[i]);
        }
        return 0;
    }


    现在,Init() 函数中的 arr 参数是一个指向“arr[10]”类型的指针。

    需要特别注意的是,这里绝对不能够使用“void Init(int(*arr)[])”来声明函数,编译器会报错:error: sizeof applied to an incomplete type

    而是必须指明要传入的数组的大小,否则“sizeof(*arr)”无法计算。但是在这种情况下,再通过 sizeof 来计算数组大小已经没有意义了,因为此时数组大小已经指定为 10 了。

  • 相关阅读:
    准备用协程模拟经典的生产者消费者
    重载操作符号
    对象池
    ssh加key
    oracle存储过程(PL/SQL)
    获取服务器ip地址
    【STL系列】结构体排序
    strtol sort snprintf snscanf strtok
    cxGrid动态创建带CheckBox列时遇到的问题...
    Windows2003 安装PostgreSQL9.0 UUID解决‘ERROR:无法载入程式库’问题
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007345.html
Copyright © 2011-2022 走看看