C++中std::size在main正常运行但在getMin函数失效的原因是什么
问题根本原因
这个问题是C++的数组参数退化特性直接导致的:
- 你在
main函数中定义的int numbers[5]是完整的数组类型,编译器明确知道它的内存长度和元素数量,所以std::size可以正常获取到数组长度为5。 - 你写的
getMin(int numbers[])函数参数,看似是数组类型,实际编译时会被自动调整为int* numbers指针类型,函数内部仅能拿到数组首元素的内存地址,完全没有携带原数组的长度信息,std::size本身不支持对指针类型求长度,自然无法正常运行。
可行修复方案
你可以根据场景选择下面任意一种方案解决问题:
方案1:额外传递数组长度作为参数
这是兼容性最高的通用写法:
#include <iostream> int getMin(int numbers[], int sizeA) { int temp = numbers[0]; for (int i = 1; i < sizeA; i++) { if (temp > numbers[i]) temp = numbers[i]; } return temp; } int main() { int numbers[5] = { 5, 5, -2, 29, 6 }; int size = std::size(numbers); std::cout << getMin(numbers, size) << " with Size of "<< size << std::endl; std::cin.get(); }
方案2:用模板保留数组类型信息
如果仅在编译期已知长度的数组上使用该函数,可以用模板避免参数退化:
template<std::size_t N> int getMin(int (&numbers)[N]) { int temp = numbers[0]; for (int i = 1; i < N; i++) { if (temp > numbers[i]) temp = numbers[i]; } return temp; }
方案3:改用标准容器
现代C++更推荐使用std::array或std::vector存储数组,容器本身自带size()成员方法,不会出现参数退化问题。
内容的提问来源于stack exchange,提问作者Clockman
相关产品推荐
相关产品推荐

