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

为什么用指针向函数传递数组时,获取到的数组长度显示为1?

问题解答

结论

该现象属于正常情况,问题根源是C/C++中数组传参的退化特性,而非运行异常。

错误原因分析

  • 当你把数组作为参数传入接收指针类型的函数时,数组会自动退化为指向数组首元素的普通指针,函数形参int* a仅保存首地址,不携带任何数组长度信息。
  • 函数内sizeof(a) / sizeof(a[0])的计算逻辑完全错误:sizeof(a)求的是指针变量自身占用的内存大小(32位环境下为4字节、64位环境下为8字节),sizeof(a[0])是int类型的大小(通常为4字节),所以计算得到的n值仅为1(32位)或2(64位),远小于你预期的数组长度3,循环仅执行1次,自然只有第一个元素被修改为3。
  • 对比main函数中同一句计算是正确的,因为main中的a是声明的int a[3]数组类型,未发生退化,sizeof(a)得到的是整个数组的总字节数12,除以int长度4得到正确长度3。

修复方案

方案1:额外传递数组长度参数

最通用的兼容C/C++的写法:

// 新增形参接收数组长度
void make3(int* a, int n) {
    for (int i = 0; i < n; i++) {
        a[i] = 3;
    }
}
int main()
{
    int a[3] = { 0, 1, 2 };
    // 调用时在数组未退化的上下文计算长度传入
    make3(a, sizeof(a)/sizeof(a[0]));
    int* b = a;
    for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++) {
        cout << *(b + i) << endl;
    }
}

方案2:C++模板自动推导数组长度

类型安全,无需手动传长度:

// 模板参数自动推导数组长度N
template<size_t N>
void make3(int (&a)[N]) {
    for (int i = 0; i < N; i++) {
        a[i] = 3;
    }
}
// 调用时直接传数组即可,自动识别长度为3
make3(a);

方案3:使用STL容器替代原始数组

C++场景下更推荐用std::array或std::vector,完全避免数组退化问题:

#include <vector>
void make3(std::vector<int>& a) {
    for (int i = 0; i < a.size(); i++) {
        a[i] = 3;
    }
}

内容的提问来源于stack exchange,提问作者pink_totoro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:54:08