您的位置:首页 > 编程语言 > C语言/C++

C++之安全使用数组的4中方法

2015-09-27 00:41 387 查看
数组有两个特质:

1. 不能复制(有些编译器将数组复制作为编译器扩展)

2. 使用数组名时,自动将其转为为指向数组第一个元素的指针(隐式类型转换)

上面两个特征决定了处理数组的函数通常通过指向数组元素的指针来处理数组内容

一下几个数组形参定义是等价的:

1.  void fuck(int *p);

2.   void fuck(int p[]);

3.  void fuck(int p[10]);

C++不会检查数组形参的长度。。。。

这种情况下, 要安全的使用数组(不出现访问越界),有以下几种方式:

1.    在数组中人为增加结束标识,  类似C风格字符串以\0 为结束标识;

2.     仿照C++标准库做法,  使用两个指针,一个指向最初始元素,一个指向最末元素的下一个元素;

3.     显示的传入数组长度这个参数

下面代码实现数组求和的功能, 分别使用了上面3中方法:

#include<iostream>

#include<vector>

#include<string>

using namespace std;

// the arry is end of \0 , like const char arry

int arry_sum1(int *p)

{

    int sum =0;

    while(*p != NULL)

      {

          sum += *p;

          ++p;

      }

    return sum;

}

int arry_sum2(int *p, size_t len)

{

    int sum =0;

    for(size_t i = 0 ; i < len ; ++i)

    {

        sum += p[i];

    }

    return sum;

}

int arry_sum3(int *pBegin, int * pEnd)

{

    int sum = 0;

    for(int * pIndex = pBegin; pIndex != pEnd ; ++ pIndex)

        sum += *pIndex;

    return sum;

}

int main(int argc, char* argv[])

{

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

    cout<<arry_sum1(a)<<endl;

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

    cout<<arry_sum2(b,9)<<endl;

    int *p1 =b;

    int *p2 = b+9;

    cout<<arry_sum3(p1,p2)<<endl;

return 0;

}

=====================================================================

另一种安全的方式是通过引用来使用数组

void fuck(int (&a)[10]);

当使用引用形参时,传递的是数组对象本身,此时编译器的类型检查会检查参数类型以及数组长度, 而不会忽略参数中的数组长度, 因而是安全的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: