C++

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

内容概要: c++ 安全使用数组 c++ 数组特征

c++ 数组有两个特征:

  • 1. 不能复制(有些编译器将数组复制作为编译器扩展)
  • 2. 使用数组名时,自动将其转为为指向数组第一个元素的指针(隐式类型转换)

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

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

1.  void fuck(int *p);

2.   void fuck(int p[]);

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

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

c++ 安全使用数组

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

  • 1.    在数组中人为增加结束标识,  类似C风格字符串以\0 为结束标识
  • 2.     仿照C++标准库做法,  使用两个指针,一个指向最初始元素,一个指向最末元素的下一个元素;
  • 3.     显式的传入数组长度这个参数

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

#include<iostream>
#include<vector>
#include<string>


using namespace std;




// the arry is end of 
#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;
}
, 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; }

  • 4. 另一种安全的方式是通过引用来使用数组
void fuck(int (&a)[10]);

当使用引用形参时,传递的是数组对象本身,此时编译器的类型检查会检查参数类型以及数组长度, 而不会忽略参数中的数组长度, 因而是安全的


c++ 安全使用数组 的内容到这里就结束了, 更多关于c++ 的内容可以参考: C++

如果对Java, Javascript, Python 感兴趣, 可以参考: ComputerScience


什么是数组

所谓数组,是有序的元素序列。 [1] 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 [1] 这些无序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top