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