【发布时间】:2020-08-03 22:42:42
【问题描述】:
给定以下函数:
template<class T>
void foo(T* ar)
{
std::cout << sizeof(ar) / sizeof(ar[0]) << std::endl;
for (int i = 0; i < 6; i++)
std::cout << ar[i] << " ";
}
以下数组:
int ar[] = { 5, 1, 6, 8, 9, 3 };
foo(ar);
我希望程序先打印“6”,然后再打印数组的内容。但由于某种原因,sizeof(ar) / sizeof(ar[0]) 的计算结果为 1(因为 sizeof(ar) 和 sizeof(ar[0]) 的计算结果都为 '4'),但打印工作正常(意味着传递的数组确实包含所有 6 个元素)。
这只发生在传递给函数的数组上(我尝试在 main() 中评估长度,其中声明了数组并且工作正常)。如何获取函数内数组的长度?
【问题讨论】:
-
您无法通过指针获取长度。这就是为什么使用
std::vector是传递数组的首选方式 -
@UnholySheep,所以如果我必须使用数组,唯一的方法就是将长度也传递给函数?
-
数组
ar在传递给函数时衰减为指针,所以foo中的ar只是一个指针 -
你应该传递一个
array_view,或者通过引用传递数组,或者显式传递大小。永远不要使用sizeof(ar) / sizeof(ar[0])之类的东西来计算数组的大小,而是使用::std::size。
标签: c++ arrays pass-by-reference sizeof function-definition