C++中将数组作为形参时防止访问越界的几种方法

C++中数组作为形参传递给函数时把数组视为指针,并没有将数组的长度信息传递给函数,因而在函数中稍有不慎就会造成数组内存的越界访问。为了避免这个问题,下面根据书上给的内容做了一点总结和说明。

数组形参的定义

void func(int *) {/* ...*/}

void func(int[]) {/* ... */}

void func(int[10]) {/* ...*/}

上面三种形参表示方式都是合法和等价的,可以看到C++将数组视为指针。另外第三种表示方式看上去在方括号中用一个常量指定了数组的长度,但事实上编译器忽略了这一方式指定的数组长度,在函数调用时即使你给func函数传递一个长度不为10的数组编译器同样可以让你通过,只不过这在实际运行中可能造成数组内存的越界访问。(注:这种表示方式要和下面介绍的数组引用相区分开来)

因为C++并不支持将数组的长度信息自动传递给函数,所以我们在编写代码时必须采取措施来避免数组形参带来的越界访问问题,下面给出几种方法

  1. 显示传递数组长度:在函数定义的参数列表中加多一个表示数组大小的参数,这种做法比较常见,举个例子:
    void func(int arr[], size_t size)
    {
        for (size_t i = 0; i < size; i++)
            // operation
    }
    

  2. 显示指定数组开始和结束的位置:这种编程风格由标准库所使用的技术启发而得,常见于迭代器的使用,举个例子:
    void func(int *begin, int *end)
    {
        for (int *pt = begin; pt != end; pt++)
            // operation
    }
    

  3. 显示添加结束的标记:在数组末尾加多一个标识元素用来检测数组的结束,常见的例子是C风格字符串,它是一种字符数组,并且以空字符null作为结束的标记
    void func(char *cstr)
    {
        for (int i = 0; '\0' != cstr[i]; i++)
            // operation
    }

  4. 通过引用传递数组:如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身
    void func(int (&arr)[10])
    {
        for (int i = 0; i < 10; i++)
            // operation
    }
    
    int main()
    {
        int size = 20;
        int iarray[size] = {0};
        func(iarray); // error
        return 0;
    }
不过这种方式编译器有着严格的规定,使用时要注意以下几点:
  • 实参和形参的数组的长度都必须是常量,包括字面值常量(例如上面的数字10)和const修饰的常量(const int Size = 20; void func(int (&arr)[Size]) { } ),例如上面在main函数中调用func函数错误的原因在于实参数组iarray定义时用了变量size来指定长度。这样做确保在编译时就能检测出可能出现的数组长度不一致的错误,而不至于等到运行时造成更严重的后果
  • 函数定义时&和变量名要用括号括起来,表示变量arr是指向int[10]型数组的指针
  • C++中的引用时允许修改原始数据,因此在函数调用时要谨慎考虑,如果不允许调用函数func对数组进行修改,在定义func函数时使用const修饰数组( void func(const int (&arr)[10]) )


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值