【问题标题】:Using sizeof on arrays passed as parameters [duplicate]在作为参数传递的数组上使用 sizeof [重复]
【发布时间】:2012-02-25 12:24:14
【问题描述】:

可能重复:
Sizeof array passed as parameter

鉴于下面的函数,我理解 sizeof 返回数组中类型指针的大小。

int myFunc(char my_array[5])
{
    return sizeof(my_array);
}

但是,对未作为参数传递的数组调用 sizeof 通常会返回数组的大小。

是什么导致了这种不一致?将数组作为参数传递时,获取数组大小的最佳方法是什么?

【问题讨论】:

标签: c++ arrays size sizeof


【解决方案1】:

是什么导致了这种不一致?

数组的名称衰减为指向其第一个元素的指针。
当您将数组传递给函数时,会发生这种衰减,因此传递给sizeof 的表达式是一个指针,因此返回指针大小。

但是,传递给sizeof 的数组总是返回数组的大小,因为在这种情况下不会衰减到指针。

当数组作为参数传递时,获取数组大小的最佳方法是什么?

不要通过值传递它们,通过引用传递它们或
将 size 作为单独的参数传递给函数。

【讨论】:

    【解决方案2】:

    你必须通过引用传递数组;您不能按值传递数组(它们会衰减为指向第一个元素的指针):

    int myFunc(char const (& my_array)[5])
    {
        return sizeof(my_array);  // or just "return 5"
    }
    

    如果你想通过引用许多不同的本地数组来调用这个函数,你可以使用函数模板来推断数组大小:

    template <unsigned int N>
    int myFunc(char const (& my_array)[N])
    {
        return sizeof(N);         // or "return N"
    }
    

    不过,您确实应该让函数返回 unsigned intstd::size_t。在 C++11 中,您还可以将它们声明为 constexpr

    【讨论】:

    • 这个答案除了指定如何获取给定大小的数组(作为参数生存)之外,还提供了使用模板的替代路线以允许多个数组大小。请注意,模板版本需要存在于头文件中...
    【解决方案3】:

    当您将数组传递给函数时,您必须调用与以下相同的函数:myFun(my_array,size),其中大小是一个整数变量,包含数组的大小。(这里是 myFun(my_array,5)) .并且函数的签名必须是:int myFunc(char my_array[], int size)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-28
      • 2011-07-26
      • 2017-05-28
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多