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?
号
尽管外观如此,函数参数还是一个指针(指向第一个数组元素),而不是一个数组。你可以得到指针大小与
如果只给一个指针,就无法确定数组的大小。
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。对于具有
或者,您可以考虑在需要动态/可调整大小的数组时使用
当您将数组传递给函数时,数组将衰减为指针,因此当您在函数中执行
要确保它不会腐烂,请这样做:
1 2 3 | int get_length(int (&arr)[4]){ ... } |
有关数组的更多信息,请参见此问题。
如果要传递任何大小的数组,请使用STD::vector。