1

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

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 的正确方法是什么?为什么我不能把它作为一个返回**

4

2 回答 2

2
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++ 中使用数组?

于 2013-10-26T02:41:46.383 回答
0

您需要在这里使用双指针:

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];
    }
}

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

于 2013-10-26T02:43:41.250 回答