试图初始化一个二维结构数组,但出现了读访问违规异常[关闭]。

问题描述 投票:0回答:1

我有一个表示n×n跳棋棋盘的结构,我有一个方法是 createAndInitBoard 它将返回一个大小为n×n的二维数组,其中包括 cellcell **`. 该函数应分配所需的内存,并给每个单元格初始化一个颜色和一个状态。

给出的代码如下。

enum cellColor { bright, dark };
enum cellStatus { emptyC, whitePiece, blackPiece };
struct cell {
    cellColor color;
    cellStatus status;
};
cellColor computeColor(int r, int c) {
    if ((r % 2 == 0 && c % 2 == 0) || (r % 2 != 0 && c % 2 != 0)) {
        return bright;
    }
    return dark;
}

到目前为止,我已经完成了以下工作。

cell** createAndInitBoard(int n) {
    cell** B = {};
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            B[i][j].color = computeColor(i, j);
            if ((i % 2 == 0 && j % 2 == 0) || (i % 2 != 0 && j % 2 != 0)) {
                B[i][j].status = emptyC;
            }
            else {
                if (i < 3) {
                    B[i][j].status = blackPiece;
                }
                if (i > 4) {
                    B[i][j].status = whitePiece;
                }
            }            
        }
    }
    return B;
}

当然,就目前而言,这只适用于8×8的板子。我也在试图想出一些条件,可以计算一个n×n的板子.但我得到了一个错误,我认为这与我初始化单元格的方式有关。

cell** B = {};

有什么办法可以解决这个问题,甚至如何改进我的代码?

c++ multidimensional-array
1个回答
1
投票

定义和初始化

cell** B = {};

零初始化 指针 B. 零初始化一个指针意味着它将是一个 无效 指针。空指针不能被取消引用(例如数组索引)。

自然的C++解决方案是使用一个向量来代替(因为在编译时不知道大小)。

std::vector<std::vector<cell>> B(n, std::vector<cell>(n));

否则你需要使用 new[]:

cell** B = new cell*[n];
for (size_t i = 0; i < n; ++i)
{
    B[i] = new cell[n];
};

但你要记得 delete[] 所有的指针都在后面 (聪明的指针 不过解决了这个删除问题)。)

© www.soinside.com 2019 - 2024. All rights reserved.