【问题标题】:How to return 2d array C++ [duplicate]如何返回二维数组C++ [重复]
【发布时间】:2021-08-11 13:42:53
【问题描述】:

我有一个需要返回二维数组的函数,我是 C++ 新手,但我搜索了很多,我得到的最好的是,它给出了“错误:无法转换 'int** (*)[3 ]' 到 'int**' 作为回报"。

int** initial_state()
{
    int arr[3][3] =
        {
            {0, 0, 0},
            {0, 0, 0},
            {0, 0, 0}}
        ;

    return arr;
}

【问题讨论】:

  • 尝试使用 int 返回类型
  • 这能回答你的问题吗? Return a 2d array from a function
  • 看看这个帖子,它问了同样的问题:*.com/questions/8617683/…
  • 考虑使用std::array。支持值语义,可以返回
  • 如果你非常想返回一个指针,那么你必须使用指针开始,并进行手动和显式的内存处理(分配和释放)。按照@user4581301 的建议使用std::array 确实容易得多。

标签: c++ gdb


【解决方案1】:

更好的选择是使用std::vector 并简单地返回vector<vector<int>>。为了使用vector,您需要包含库vector。 (#include<vector>)

代码如下:

vector<vector<int>> initial_state()
{
    vector<vector<int>> arr
    {
        {0, 0, 0},
        {0, 0, 0},
        {0, 0, 0} 
    };

    return arr;
}

如果必须使用返回二维数组,则需要将该数组声明为动态数组。

int** initial_state()
{
    //Create an array of pointers with size 3.
    int** arr = new int* [3];

    //Each pointer points to an array with size 3.
    for (int i = 0; i < 3; i++)
    {
        arr[i] = new int[3];
    }

    //Fill the 2d array with values.
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            arr[i][j] = 0;
        }
    }

    return arr;
}

【讨论】:

    【解决方案2】:

    您可以使用 auto 关键字执行类似的操作,如下例所示:

    auto make_array() {
        int arr[3][3];
        return arr;
    }
    

    它实际上是一个指向ints 的指针数组,但它可以工作。

    【讨论】:

    • 编译器真的会使用arr的实际类型作为返回类型(即int [3][3])吗?它不会像往常一样衰减到指针(即int (*)[3])吗?如果衰减为指针,那么OP还是会有大问题,返回一个指向局部变量的指针。
    • 当他们发现他们选择为正确的答案不起作用时,男孩哦男孩是一个令人讨厌的惊喜。
    • @user4581301 确实如此,我为数组的每个部分设置了一个值,它没有给出任何错误