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

如何将动态分配的结构体数组作为函数参数传入?

问题分析与解决方案

错误根源

你用new动态分配的数组本质是指向数组首元素的指针(类型为structtype*),但你的函数参数要么要求固定大小为15的数组引用,要么对数组参数的理解有误,导致类型完全不兼容:

  1. 函数read_info的参数structtype (&arr)[15]是对栈上固定大小15的数组的引用,和动态分配的指针类型无法匹配,编译器无法完成隐式转换。
  2. 第二个错误大概率是调用Append时误传了&arr(指针的地址,类型为structtype**),或者函数参数的固定大小约束和动态数组的实际大小冲突。

可行解决方案

方案1:改用指针+数组长度的参数形式(兼容C风格)

放弃函数参数里的固定数组大小约束,直接传递指针和数组的实际长度,这是处理动态数组的标准方式:

  • 修改函数原型:
    void read_info(structtype* arr, int arr_size, int integer);
    void Append(structtype* arr, int arr_size);
    
  • 调用时传入动态数组指针和实际大小:
    read_info(arr, counter + 15, 你要传的整数);
    Append(arr, counter + 15);
    
    函数内部可以通过arr_size控制数组的访问范围,避免越界。

方案2:使用C++标准容器std::vector(推荐)

用std::vector代替手动动态分配数组,它会自动管理内存和大小,类型安全且更易用:

  • 替换动态数组的创建代码:
    std::vector<structtype> arr(counter + 15);
    
  • 修改函数原型为接收vector的引用:
    void read_info(std::vector<structtype>& arr, int integer);
    void Append(std::vector<structtype>& arr);
    
  • 调用时直接传入arr即可,函数内部可以通过arr.size()获取数组实际大小,无需额外传递长度参数。

原写法失效的核心原因

  • 固定大小的数组引用(structtype (&)[15])只能绑定到栈上声明的、大小恰好为15的数组(比如structtype arr[15];),无法绑定到new出来的动态数组指针——两者属于完全不同的类型系统。
  • 函数参数里的structtype arr[15]会被编译器隐式转换为structtype* arr,但如果函数内部按15的大小处理,你的动态数组实际是counter+15大小,要么浪费空间,要么当counter>0时函数访问超过15的位置会触发未定义行为;若调用时误传&arr,则会出现structtype**转structtype*的类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:54:25