在作为参数传递的数组上使用sizeof

时间:2012-02-25 12:24:14

标签: c++ arrays size sizeof

  

可能重复:
  Sizeof array passed as parameter

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

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

避免使用原始指针,使用std :: vector而不是指向数组的指针:

int myFunc( const std::vector<char>& buf)
{
    return buf.size();
}