鉴于下面的函数,我知道sizeof返回数组中类型指针的大小。
int myFunc(char my_array[5])
{
return sizeof(my_array);
}
但是,在未作为参数传递的数组上调用sizeof通常会返回数组的大小。
导致这种不一致的原因是什么?将数组作为参数传递时获取数组大小的最佳方法是什么?
答案 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 int
或std::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();
}