【问题标题】:find size of parameterized array查找参数化数组的大小
【发布时间】:2023-04-07 19:24:01
【问题描述】:

我只是想在函数中获取作为参数传递的数组的大小,但我不明白为什么 sizeof(k)/sizeof(k[0]) 在正常工作时只返回一个声明它的范围,我在这里缺少什么?

代码如下:

#include <iostream>

using namespace std;

int fn(int k[]){
    
    cout << "size in function :" << sizeof(*k) / sizeof(k[0]) << endl; //returns 1 for some reason    
    //cout << "size in function :" << end(k)-begin(k) << endl; // can't find begin-end fitting function?


    int m = *max(&k[0], &k[sizeof(k)/sizeof(int)]);
    return m;
}

int main()
{
    int k[] = { 1,2,3,4,5,6,7 };
    int s = size(k);
    cout << "size :" << sizeof(k) / sizeof(k[0]) << endl;
    cout << "max: " << fn(k);

    return 0;
}

【问题讨论】:

  • "...我只是想在函数中获取作为参数传递的数组的大小..." 你不能 - 要么通过尺寸;使用std::array;使用std::vector 或模板函数。
  • 我在这里缺少什么? -- int fn(int k[])int fn(int* k) 完全相同。函数声明中的[] 只是指针的语法糖。现在您看到 k 是一个指针,其余的应该是不言自明的。
  • @PepijnKramer 您认为我在这里的两个链接中的哪一个是“一遍又一遍地盲目重复”?这些都是强词。

标签: c++


【解决方案1】:

数组的大小只在编译时“存在”。到编译代码时,数组只不过是指针。

所以如果你想让一个函数接受一个大小的数组,那么大小需要在编译时传递,这意味着它必须是一个模板参数。

template<std::size_t N>
int fn(int (&k)[N]){
    cout << "size in function :" << N << endl;
    cout << "size in function :" << end(k)-begin(k) << endl;

    int m = *max(begin(k), end(k));
    return m;
}

【讨论】:

    【解决方案2】:

    我在这里错过了什么?

    参数的类型是int*(从未知范围的数组调整后)。

    sizeof(k)/sizeof(int)
    

    您将指针的大小除以整数的大小。该划分与元素被指向的数组的大小无关。

    当它在声明的范围内正常工作时

    那是因为k 的类型不是int*k 的类型是int[7]

    查找参数化数组的大小

    参数的类型在 C++ 中绝不是数组。如果将函数参数声明为数组,则类型将调整为指向该数组元素的指针。

    如果参数的类型是指针,并且该指针指向数组的元素,则没有通用的方法来找出相关数组的大小。

    某些数组包含一个序列,该序列由具有标记值的元素终止。您可以通过对标记值执行线性搜索来确定此类序列的长度。以空字符结尾的字符串是此类序列的常见示例。

    老式的 C 风格是将数组的大小作为单独的参数传递:

    int fn(int k[], std::size_t size);
    // usage
    int k[] = { 1,2,3,4,5,6,7 };
    fn(k, std::size(k));
    

    一种更现代的方法是将指针和大小组合在一个类中。标准库中有一个用于此目的的类模板:

     int fn(std::span<int> k);
     // usage
     int k[] = { 1,2,3,4,5,6,7 };
     fn(k);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2011-11-16
      • 2021-06-07
      • 2012-05-04
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多