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

如何在C++中从函数返回不同大小的数组的数组

如何在C++中返回包含不同大小数组的数组并正确访问?

你的代码目前存在两个关键问题,导致无法正常访问第二个数组:

  • 局部数组生命周期失效:函数fun()里的a、b是栈上的局部数组,函数执行结束后,这些数组的内存会被系统回收。返回指向它们的指针属于悬垂指针,后续访问行为是未定义的(第一个数组能输出值只是巧合,内存还没被覆盖)。
  • 返回值类型不匹配:你实际想返回的是存储两个数组指针的数组,但代码里返回的是*arr(即第一个数组的指针),所以main里只能拿到第一个数组的地址,自然无法访问第二个数组。

下面是几种可行的解决方案:

方案1:动态分配堆内存(手动管理)

用new在堆上分配数组,内存不会随函数结束释放,同时返回指向指针数组的指针:

#include <iostream>

int** fun() {
    // 动态分配两个不同大小的数组
    int* a = new int[3]{3, 2, 1};
    int* b = new int[2]{5, 4};
    // 动态分配指针数组,存储两个数组的地址
    int** arr = new int*[2];
    arr[0] = a;
    arr[1] = b;
    return arr;
}

int main() {
    int** array = fun();
    // 访问第一个数组
    printf("%d, %d, %d\n", array[0][0], array[0][1], array[0][2]);
    // 访问第二个数组
    printf("%d, %d\n", array[1][0], array[1][1]);
    
    // 必须手动释放内存,避免泄漏
    delete[] array[0];
    delete[] array[1];
    delete[] array;
    return 0;
}

方案2:使用标准库容器(推荐)

C++的std::vector会自动管理内存,完全规避悬垂指针和内存泄漏问题,代码更简洁安全:

#include <iostream>
#include <vector>

std::vector<std::vector<int>> fun() {
    std::vector<int> a = {3, 2, 1};
    std::vector<int> b = {5, 4};
    std::vector<std::vector<int>> arr;
    arr.push_back(a);
    arr.push_back(b);
    return arr;
}

int main() {
    auto array = fun();
    // 访问第一个数组
    printf("%d, %d, %d\n", array[0][0], array[0][1], array[0][2]);
    // 访问第二个数组
    printf("%d, %d\n", array[1][0], array[1][1]);
    return 0;
}

方案3:使用全局数组(不推荐)

将数组声明为全局变量,其生命周期与程序一致,但全局变量会增加代码耦合,仅适合简单场景:

#include <iostream>

// 全局数组,生命周期覆盖整个程序
int a[] = {3, 2, 1};
int b[] = {5, 4};

int** fun() {
    static int* arr[] = {a, b};
    return arr;
}

int main() {
    int** array = fun();
    printf("%d, %d, %d\n", array[0][0], array[0][1], array[0][2]);
    printf("%d, %d\n", array[1][0], array[1][1]);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:31:18