在动态2D布尔数组中更改一个值似乎会更改不同数组中不同位置的值
Changing one value in a Dynamic 2D boolean array seemingly changes the value at a different place in a different array
我有两个动态分配的布尔阵列尺寸高度 *宽度,我用...
分配/初始化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
),您至少应该取得成功。
相关文章:
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何在数组中交换最小和最大的位置?
- C++ 2D 数组写入多个位置
- C++指针数组到字符数组中的特定位置
- 递增 'int i = 0' 以在初始化的字符数组的位置递增
- 数组中所有元素的最新最小元素的第五个位置
- 关于引用数组位置的问题
- 在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
- 创建 2D 数组0xCCCCCCCC访问冲突写入位置
- 如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?
- 如何在 3x4 数组中随机 4 个不同的位置
- C++不同内存位置中的默认数组值
- 使用动态数组访问冲突写入位置
- 将字符串分配到动态数组位置时出错
- 查找数组位置的最大值
- 如何使用变量名称引用数组位置
- 面向对象C++帮助?出于某种原因,对象变量的输出返回数值数组位置而不是实际值
- 在 C++/CLI Visual Studio C++ 中以指定的数组位置将文本框中的值保存在 char 中
- 将名称添加到C++中的数组位置
- 如何在c++中表示数组位置的范围