尝试访问 C 中二维数组的地址并出现分段错误

Trying to access address of 2D array in C and getting segmentation fault

我是 C 的初学者,我对指针以及它们如何传递给其他函数有些困惑。我正在做一个项目,在我的主要功能中,我分配了一个代表游戏板的二维字符数组。

// In main, allocate 2D array   
char **board = malloc(rows * sizeof(char*));
for (int i = 0; i < rows; i++) {
    board[i] = malloc(cols * sizeof(char)); 
}

稍后可以调用一个函数来加载游戏的保存版本,从而重新分配我的棋盘变量。

void stringToGame(char ***board, int *rows, int *cols, int *turn, int *winLength) {
    // Set new values for rows and cols based on file
    ...

    // Malloc board 
    *board = malloc(*rows * sizeof(char*));
    for (int i = 0; i < *rows; i++) {
        *board[i] = malloc(*cols * sizeof(char));   
    }

}

当我在我的主函数中调用 stringToGame 方法时,我正在传递棋盘的地址。

stringToGame(&board, &rows, &cols, &turn, &winLength);

传递板的地址导致分段错误,我不知道为什么。

作为次要问题,在分配新数组之前,我是否需要为电路板释放()我的旧二维数组?

首先,你声明的不是2-d array,它是一个双指针。这两者之间有一个difference

其次,您不需要将数组的地址传递给函数,因为无论如何数组都是通过引用传递的。在 malloc-ing 之后,您可以简单地将双指针传递给您的函数。

stringToGame(board, &rows, &cols, &turn, &winLength);

你的第二个问题的答案,是的,你应该先 free 你的旧指针,然后再 malloc 它,否则你的程序会发生内存泄漏。 board 的第一个值将丢失,您将无法释放它。

这个

*board[i] = malloc(*cols * sizeof(char));

应该是

(*board)[i] = malloc(*cols * sizeof(char));

因为数组下标运算符 [] 比间接运算符 * 具有更高的优先级,因此将首先执行,但您需要相反的情况发生,即首先 *,然后[i].