对作为参数传递的数组使用sizeof

Using sizeof on arrays passed as parameters

本文关键字:sizeof 数组 参数传递      更新时间:2023-10-16

可能重复:
作为参数传递的数组大小

给定下面的函数,我知道sizeof返回数组中类型的指针的大小。

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

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

造成这种不一致的原因是什么?当数组作为参数传递时,获取数组大小的最佳方法是什么?

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

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

是什么导致了这种不一致

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

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

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

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

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