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

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

在下面的简单 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

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

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

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

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

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

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?

数组不能按值传递给函数,并且只能按引用传递已知大小的数组。所以你需要一个模板来从函数参数推断任何数组的大小:

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

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

或者,您可以考虑使用 std::array(或者当您需要 dynamic/resizable 数组时使用 std::vector),而不是古怪的内置数组。