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

Changing one value in a Dynamic 2D boolean array seemingly changes the value at a different place in a different array

本文关键字:数组 位置 布尔 2D 动态 一个      更新时间:2023-10-16

我有两个动态分配的布尔阵列尺寸高度 *宽度,我用...

分配/初始化
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 0 0 0 0 0 0 0 0 0 0    。。。。。。#。#。x x x。#。。0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0    。。。。。。#。。#x x x x#。。0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 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 0    。。。。。。#####x x x##。。0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0    。#。。。。。。。。#x x x x @。0 1 0 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 0 0 1 1 1 1 1 0 0 0     。#。。。。。。。。#x x x。。。0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0    。G # 。。。###。#x x。#。。0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0    。#。。。。。。。。。X 。。。。。0 1 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 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 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 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 1 0 0    [6] [0] @ 205:0    添加了东部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)地板(东/宽度)

实际上是5,

东%宽度

是16。因此,对我来说,访问的任何事物都不会改变。这在整个程序中逐渐发生,总是会更改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),您至少应该取得成功。