You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:45:03