为什么C++函数内参数数组用sizeof计算长度返回1
问题解答
核心原因
本质是C/C++的数组参数退化规则导致的:
- 数组作为函数参数传递时会自动退化为指向数组首元素的指针,函数参数声明里的
int k[]和int *k完全等价,不会保留原始数组的长度信息。 - 在
main函数的数组声明作用域内,k是完整的数组类型,sizeof(k)返回整个数组占用的总字节数,因此sizeof(k)/sizeof(k[0])可以正确计算元素个数。 - 在
fn函数内k已经是指针类型,你代码里写的sizeof(*k)取的是指针指向的第一个int元素的大小,和sizeof(k[0])(int类型的大小)相等,相除结果永远为1。begin()/end()函数也仅支持完整数组类型,无法对指针生效,因此会报错。
常用修复方案
方案1:额外传递长度参数(兼容C/C++,通用性最强)
直接把数组长度作为第二个参数传入函数:
int fn(int k[], int len){ cout << "size in function :" << len << endl; int m = *max(&k[0], &k[len]); return m; } // main中调用写法 cout << "max: " << fn(k, sizeof(k)/sizeof(k[0]));
方案2:模板推导数组长度(仅C++可用)
通过模板让编译器自动推导传入数组的长度:
template<size_t N> int fn(int (&k)[N]){ cout << "size in function :" << N << endl; int m = *max(&k[0], &k[N]); return m; } // 调用时直接传数组即可,编译器会自动识别长度 cout << "max: " << fn(k);
方案3:使用STL容器(C++推荐写法)
替换原生数组为std::vector或std::array,自带size()方法,不存在参数退化问题:
#include <vector> #include <algorithm> int fn(vector<int>& k){ cout << "size in function :" << k.size() << endl; int m = *max(k.begin(), k.end()); return m; } // main中声明写法 vector<int> k = { 1,2,3,4,5,6,7 };
内容的提问来源于stack exchange,提问作者Corentin Salomon
相关产品推荐
相关产品推荐

