将数组作为参数传递给函数时,c ++获得不同的数组长度

时间:2015-02-16 14:01:40

标签: c++ arrays sizeof

在下面简单的c ++程序中,我试图通过使用sizeof来获取数组的长度,对于相同的数组,为什么当将数组作为参数传递给函数时,数组长度变为不正确的?我应该如何获得作为函数参数的数组的长度?

#include <iostream>

int get_length(int arr[]){
  return sizeof(arr)/sizeof(*arr);
}

int main(){
  int arr[] = {5,10,15,20};
  std::cout << "non function call: " << sizeof(arr)/sizeof(*arr) << std::endl;
  std::cout << "function call: " << get_length(arr) << std::endl;
}

运行结果:

non function call: 4
function call: 2

2 个答案:

答案 0 :(得分:2)

  

将数组作为参数传递给函数时,数组长度变得不正确?

尽管有外观,但函数参数是指针(指向第一个数组元素),而不是数组。您可以获得指针大小与int大小的比率,在您的平台上恰好是2。

只有指针才能确定数组的大小。

  

我应该如何获得作为函数参数的数组的长度?

数组不能通过值传递给函数,只能通过引用传递已知大小的数组。因此,您需要一个模板来从函数参数中推断出任何数组的大小:

template <typename T, size_t N>
size_t get_length(T (&)[N]) {return N;}

在C ++ 14或更高版本中,此函数在标准库中可用,称为std::size。它被重载以适用于具有size成员函数的数组和STL样式容器。

或者,您可以考虑在需要动态/可调整大小的数组时使用std::array(或std::vector,而不是使用古怪的内置数组。

答案 1 :(得分:0)

当您将数组传递给函数时,数组会衰减为指针,因此当您在函数中执行sizeof(arr)时,您会询问指针的大小。

为了确保它不会腐烂,请按照以下步骤进行:

int get_length(int (&arr)[4]){
...
}

有关数组的更多信息,请参阅this问题。

如果要传递可以是任何大小的数组,请使用std :: vector。