在作为参数传递的数组上使用 sizeof [重复]

问题描述 投票:0回答:3

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

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

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

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

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

c++ arrays size sizeof
3个回答
10
投票

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

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 int
std::size_t
。在 C++11 中,您还可以将它们声明为
constexpr


9
投票

造成这种不一致的原因是什么?

数组的名称随着指向其第一个元素的指针而衰减。
当您将数组传递给函数时,会发生这种衰减,因此传递给

sizeof
的表达式是一个指针,从而返回指针大小。

但是,传递给

sizeof
的数组始终返回数组的大小,因为在这种情况下不会衰减到指针。

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

不要按值传递它们,而是按引用传递它们或
将大小作为单独的参数传递给函数。


0
投票

当您将数组传递给函数时,您必须调用与以下相同的函数:

myFun(my_array,size)
,其中大小是包含数组大小的整数变量。 (这里是
myFun(my_array,5)
)。并且函数的签名必须是:
int myFunc(char my_array[], int size)

© www.soinside.com 2019 - 2024. All rights reserved.