尝试访问 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]
.
我是 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]
.