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

c++ gets different array length when passing the array as a arguments to a fucntion

本问题已经有最佳答案,请猛点这里访问。

在下面的简单C++程序中,我试图通过使用EDCOX1(0)来获得数组的长度,对于同一个数组,为什么当数组作为参数传递给函数时,数组长度变得不正确?如何获取作为函数参数的数组的长度?

1
2
3
4
5
6
7
8
9
10
11
#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;
}

运行结果:

1
2
non function call: 4
function call: 2


when passing the array as an argument to a function the array length becomes incorrect?

尽管外观如此,函数参数还是一个指针(指向第一个数组元素),而不是一个数组。你可以得到指针大小与int大小的比率,在你的平台上正好是2。

如果只给一个指针,就无法确定数组的大小。

How should I get the length of an array who is an argument of a function?

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

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

在C++ 14或更高版本中,此函数在标准库中可用,称为EDCOX1 OR 2。对于具有size成员函数的数组和stl样式的容器来说,它都是超负荷的。

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


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

要确保它不会腐烂,请这样做:

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

有关数组的更多信息,请参见此问题。

如果要传递任何大小的数组,请使用STD::vector。