将数组作为参数传递给函数时,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
),而不是古怪的内置数组。
在下面的简单 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
),而不是古怪的内置数组。