首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当传递给C++中的函数时,为什么我们指定数组大小作为参数?

当传递给C++中的函数时,为什么我们指定数组大小作为参数?
EN

Stack Overflow用户
提问于 2018-10-30 17:46:21
回答 5查看 8.4K关注 0票数 5

我搜索了这个问题,他们中的大多数都说了同样的事情。因为我们只在函数中传递数组地址,编译器不能通过查看地址来知道数组大小,他们说。我尝试使用这段代码来测试这一点,两个函数给出了相同的结果。那么,将数组大小指定为函数参数对我有什么帮助呢?在什么情况下,指定大小对我们有帮助?

代码语言:javascript
复制
class ArrayTest
{
    public:
     void say(int ar[])
     {
         cout<<ar[1]<<endl;
         cout<<ar[7]<<endl;
     }

      void say(int ar[],int sizeAn)
     {
         cout<<ar[1]<<endl;
         cout<<ar[7]<<endl;
     }

};

int main()
{
    ArrayTest test;
   int anAr[5] = {1,2,3,4,5};
   test.say(anAr);
   test.say(anAr,5);
    return 0;

}
EN

回答 5

Stack Overflow用户

发布于 2018-10-30 17:50:58

这关系到你作为程序员是否有机会进行边界检查,而不是编译器是否能做到这一点。

只需尝试打印出数组中的所有元素,大小如下:

代码语言:javascript
复制
 void say(int ar[],int sizeAn)
 {
     for(int i=0; i< sizeAn; ++i)
         cout<<ar[i]<<endl;
 }

现在不考虑大小:

代码语言:javascript
复制
 void say(int ar[])
 {
     for(int i=0; i< /*HOW DO I KNOW NOW?*/; ++i)
         cout<<ar[i]<<endl;
 }
票数 11
EN

Stack Overflow用户

发布于 2018-10-30 17:50:35

请注意,您的代码调用了未定义的行为,因为您正在访问一个只有5个元素大小的数组的元素7。使用size参数,例如,您可以检查索引是否超过其大小,而不执行该调用。

在您的示例中,您将获得相同的结果,因为您实际上并没有使用参数:

代码语言:javascript
复制
 void say(int ar[],int sizeAn)
 {
     cout<<ar[1]<<endl;
     cout<<ar[7]<<endl;
 }

sizeAn是未使用的,所以它没有任何区别。但是考虑一下下面的代码:

代码语言:javascript
复制
void say(int ar[],int sizeAn)
     {
         for (int i = 0; i < sizeAn; i++){
             cout<<ar[i]<<endl;
         }
     }

在这里,它打印数组中的所有项,所以它需要知道数组有多大。例如,如果使用std::vector,则不需要传递大小,因为只需调用size函数,但不能使用C样式数组传递大小,因此如果您想要编写一个根据大小而表现不同的函数,则需要将该大小作为参数传递。

下面是一个更实际的代码示例,其中使用size参数来避免未定义的行为:

代码语言:javascript
复制
void say(int ar[],int sizeAn)
 {
     cout<<ar[1]<<endl;
     if (sizeAn >= 8){
         cout<<ar[7]<<endl;
     }
 }

现在,它与您的代码一样,只是在元素7实际存在的情况下才打印它。

票数 3
EN

Stack Overflow用户

发布于 2018-10-30 17:50:40

正如您所说,如果将数组传递给函数,编译器无法判断数组有多大。您的第一个say函数尝试引用超过数组末尾的内容(ar7超出了5的大小)。你的第二个say函数意味着你可以检查长度,以确保你不会犯这个错误。

代码语言:javascript
复制
  void say(int ar[], int sizeAn) 
  {
     if(sizeAn>1)
        cout<<ar[1];endl;
     if(sizeAn>7)
        cout<<ar[7];endl;
  }

这样,您就知道了长度,函数就可以在访问无效内存位置之前对其进行检查。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53061454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档