有没有办法获取传递给函数的数组的大小?

Posted

技术标签:

【中文标题】有没有办法获取传递给函数的数组的大小?【英文标题】:Is there a way to get the size of an array passed to a function? 【发布时间】:2020-02-20 11:53:45 【问题描述】:

我的函数接收一个数组作为参数,但该数组衰减为一个指针,因此 sizeof() 不起作用。我不允许导入任何额外的库,并且该数组作为 int arr[] 传递。当我搜索它时,大多数人只是说在函数之外定义它并将其作为参数传递,但我不能这样做。那么有没有办法让我获得数组大小?

【问题讨论】:

简短回答:不,不可能 简单的回答:不,你不能没有额外的信息。您有一个指向内存中“随机”地址的指针,该指针不知道有多少后续内存是“有效的” 长答案:见***.com/questions/492384/… How to find the 'sizeof' (a pointer pointing to an array)?的可能重复 除非数组有一些结构,比如一个“魔法”值来终止它,否则你不能。我怀疑您遗漏了您的需求中的一些重要信息。 【参考方案1】:

一共有三种方式(其实是两种,因为其中两种方式基本相同,只是类不同而已):

    使用std::vector代替数组,使用size函数获取元素个数 改用std::array(其实和第一个一样)

    使用模板并通过引用传递数组:

    template<size_t N>
    void my_function(int (&my_array)[N])
    
        std::cout << "The number of elements in the array is " << N << '\n';
    
    

如果您让数组衰减为一个指针,那么您所拥有的只是指向数组单个元素的指针。没有关于数组本身的信息,比如它的大小。使用指针时,您需要将大小作为单独的参数传递。

如果不允许更改函数签名,并且该函数仅将指针作为参数,则实际上无法获取数组的大小。对于面试问题,这可能是您应该给出的答案。

如果这是在学校或类似情况下的作业,您必须与老师交谈并告诉他们这是不可能的,或者提出一种您不需要明确要求大小的算法(例如添加某种 终止符 到数组,类似于 C 样式字符串的终止方式)。

【讨论】:

我理解 OP 不允许更改参数,所以我认为这不是一个真正的解决方案。

以上是关于有没有办法获取传递给函数的数组的大小?的主要内容,如果未能解决你的问题,请参考以下文章

尝试将数组传递给 ajax 加载函数,但我的控制器没有正确获取数组

将 char 缓冲区传递给函数并获取缓冲区的大小

如何从传递给某些 STL 算法的谓词中获取元素的索引?

Python 2.7:仅从文件句柄(而不是路径)获取文件的大小

有没有办法获取选项标签值并将其传递给车把中的助手?

扩展作为内存传递的向量的大小