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

C++函数数组参数sizeof返回8的原因及数组大小获取方法

现象原因
  • C++存在数组退化为指针的语法规则:原生数组作为参数传入普通函数时,会自动转换为指向数组首元素的指针,函数参数中声明的vector<int> adj[]本质等价于vector<int>* adj,和main函数中定义的数组类型完全不同。
  • main函数中的adj是长度为4的vector<int>数组类型:64位环境下每个std::vector对象的大小为24字节(底层通常实现为3个指针成员),整个数组总大小为4 * 24 = 96字节,因此sizeof(adj)输出96。
  • size_f函数中的adj已经是指针类型:64位环境下指针的固定大小为8字节,因此sizeof(adj)输出8,和数组本身的总大小没有关系。
正确获取传入数组大小的方案

下面是几种常用的实现方式:

  • 方案1:额外传递数组长度参数
    调用函数时同步传入数组的元素个数,修改后的函数示例:
    // 调用时传入size_f(adj, 4)即可
    void size_f(vector<int> adj[], int len) {
        // 直接使用len作为数组元素个数
    }
    
  • 方案2:使用模板推导数组长度(仅适用于编译期大小确定的栈数组)
    通过模板参数自动推导数组长度,不需要手动传参:
    template<size_t N>
    size_t get_array_size(vector<int> (&adj)[N]) {
        return N; // 返回值就是数组的元素个数
    }
    
  • 方案3:替换原生数组为STL容器(最推荐的C++实现方式)
    弃用原生数组,改用std::vector或std::array等标准库容器,容器本身自带size()方法可以直接获取元素个数,示例:
    // 把原生数组替换为vector容器
    vector<vector<int>> adj = {{0, 1}, {0, 2}, {1, 2}, {2, 3}};
    // 传参后直接调用adj.size()即可获取元素个数
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:54:03