如何在多维数组上调用 new

How to call new on a multi-dimensional array

本文关键字:调用 new 数组      更新时间:2023-10-16

我正在尝试编译以下代码:

bool **copyBools( bool const * const * const input )
{
    bool retval[4][4] = new bool[4][4];
    for( int i=0; i<4; ++i )
    {
        for( int j=0; j<4; ++j )
        {
            retval[i][j] = input[i][j];
        }
    }
    return retval;
}

但是,它不会编译并给出这些错误。 第一个错误在bool retval行上,第二个错误在return行上:

error: array must be initialized with a brace-enclosed initializer
error: cannot convert ‘bool (*)[4]’ to ‘bool**’ 

我的理解是,[][]数组与**是一回事。 这不是真的吗? 这段代码有什么问题? 为二维数组调用 new 的正确方法是什么? 为什么我不能将其作为**退回?

bool retval[4][4] = new bool[4][4];

返回类型是一个指针,您必须将其分配给指针变量而不是数组变量。

 我的理解是 [][] 数组与 ** 是一回事。这不是真的吗? 为什么我不能将其作为**退回?

不,因为数组衰减不是递归的。当你做new bool[4][4]时,你会得到bool (*) [4]作为返回的指针(这里只有第一级衰减了)。

为二维数组调用 new 的正确方法是什么?

bool (*retval) [4] = new bool[4][4];

应该工作。每个元素都像往常一样访问 retval[i][j] ,只是retval的类型对于不知情的人来说有点奇怪;它是指向四个布尔值数组的指针。但是,以下替代方法(两个维度都丢失)更安全,因为编译器可以检查长度,因为它是类型的一部分;但是,这种方法也丢失了第二个维度。如果要保留这两个维度,请使用 std::array<std::array<bool, 4>, 4> 。此方法和std::array方法的警告是,它们只能在第一个维度未知时使用,但所有剩余维度在编译时都是已知的;这是用于声明指向数组的指针。即使编译时所有维度都未知,也可以使用以下方法。

这种替代方法是使用指针数组,并用布尔数组浸渍此数组中的每个指针。

bool** ptrs = new bool*[4];
for (size_t i = 0; i < 4; ++i)
   ptrs[i] = new bool[4];

这允许您以bool** .在这里,new bool*[4]在第一级衰减并返回一个bool**指针。但是,如果两个维度都未知,则推荐的(惯用)方法是使用 std::vector .

推荐阅读: 如何在C++中使用数组?

您需要在此处使用双指针:

bool** retval = new bool*[4];
for( int i=0; i<4; ++i )
{
    retval[i] = new bool[4];
    for( int j=0; j<4; ++j )
    {
        retval[i][j] = input[i][j];
    }
}

注意:您也可以在这里使用多维向量,