我正在开发一个C ++ minecraft克隆,其中Chunk对象保存一个指向其相邻块(邻居)的指针列表。一个块最多可以有6个邻居,但是如果一个块在一侧没有邻居,那么该阵列中的元素就是一个nullptr。 Chunks有块结构的3D数组,它有一个数据成员:type(int)。 Chunks将他们的块和一组指向其邻居块的指针传递给渲染器:
Block (*neighbor_blocks[6])[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE];
for (int i = 0; i < 6; i++) {
if (neighbors[i] == nullptr) {
neighbor_blocks[i] = nullptr;
}
else {
neighbor_blocks[i] = &(neighbors[i]->blocks);
}
}
renderer.gen_buffer(blocks, neighbor_blocks);
它调用的方法的签名如下所示:
void BlockRenderer::gen_buffer(Block blocks[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE], Block (*neighbor_blocks[6])[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE]);
我相信这会产生一系列指向我的3D Block数组的指针:
Block (*neighbor_blocks[6])[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE])
为了测试我的指针数组,我做了以下几点:
if (neighbor_blocks[4] != nullptr) {
printf("%d\n", neighbor_blocks[4][0][0][0]->type);
}
使用块初始化块数组中的每个元素,因此在任何块上调用块[0] [0] [0]应该不是问题,如您所见,每个neighbor_blocks元素都使用nullptr初始化或者给出指向块的块数组的指针。但是,我的打印行有时会导致此异常:
0xC0000005:访问冲突读取位置0x003F63D8。
我的方法是否能使指向3D数组的指针数组正确?我是否正确访问了数据?有时候不会抛出异常,向我暗示我正在访问错误的内存,有时我可以访问我正在访问的内容,但有时我的程序无法访问它。