更改动态2D布尔数组中的一个值似乎会更改不同数组中不同位置的值

时间:2017-10-03 06:40:26

标签: c++ arrays dynamic

我有两个动态分配的大小为* width的布尔数组,我用...分配/初始化

bool ** visited; 
bool ** inQueue; 
visited = new bool * [height];
inQueue = new bool * [height];
for (int i = 0; i < height; i++) {
    visited[i] = new bool(width);
    inQueue[i] = new bool(width);
}

for (int i = 0; i < height; i++)
    for (int j = 0; j < width; j++) {
        visited[i][j] = false;
        inQueue[i][j] = false;
    }

在我的程序结束时,我用...清理那个记忆。

for (int i = 0; i < height; i++) {
    delete [] visited[i];
    delete [] inQueue[i];
}
delete [] visited;
delete [] inQueue;

但是,在两者之间,我得到一个奇怪的情况,即访问者的第0列中的各种值都变为真,即使它们没有被直接更改。

此行为的一个示例是:

    . . . . . . . . . . . X . . . . .       0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
    . . . . . . # . # . X X X . # . .       0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 
    . . . . . . # . . # X X X X # . .       0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 
    . . . . . . # . X X X X X X # . .       0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 
    . . . . . . # # # # # X X X # . .       0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 
    . # . . . . . . . . # X X X X @ .       0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 
    . # . . . . . . . . # X X X X . .       1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 
    . # . . . . . . . . # X X X . . .       0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 
    . G # . . . # # # . # X X . # . .       0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 
    . # . . . . . . . . . X . . . . .       0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
    . . . . . . . . . . # . . . . . .       0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
    . . . . . . . . . . . . . . . . .       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    . . . . . . . . . . . . . . . . .       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    . . . . . . . . . . . . . . . . .       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    . . . . . . # . . . . . . . # . .       0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 
    . . . . . . # . . . . . . . # . .       0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 
    . . . . . . # . . . . . . . # . .       0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 

    [6][0] @ 205: 0
    Added Eastern Pos: (16, 5)
    [6][0] @ 208: 1
    [6][0] @ 210: 1
    ...

这是我的输出。正如你所看到的,访问[6] [0]中的位置在我在205行之后的输出中标记的内容中变为真,同时添加了东部位置。这个变化的代码在这里:

cout << "[6][0] @ 205: " << visited[6][0] << endl;
cout << "Added Eastern Pos: (" << (east % width) << ", " << (int)floor(east / width) << ")\n";
inQueue[(int)floor(east / width)][east % width] = true;
cout << "[6][0] @ 208: " << visited[6][0] << endl;
xVal.addToQueue(to_string(east % width));

特别是在第三行,我改变了inQueue的值,然后立即(如上面的块所示)访问[6] [0]已经改变为true。请记住

  

(int)floor(east / width)

实际上是5,

  

东%宽度

是16.所以,对我而言,任何访问都会被改变是没有意义的。这会在我的程序运行过程中逐步发生,始终会更改第0列的值。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

使用visited[i] = new bool(width),您可以分配一个布尔值,而不是布尔值数组。从此以后,当期望一个width元素数组(实际上只包含一个元素)时,你会超出数组边界并获得未定义的行为(这就是你在输出中看到的内容)。

看到区别:

int main() {
    int width =20;
    int sizeofBool = sizeof(bool(width)); // -> 1
    int sizeOfBoolArray = sizeof(bool[width]); // -> 20
}

所以写visited[i] = new bool[width](以及inQueue),你至少应该先行。