我是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));
}
}
当我在main函数中调用stringToGame方法时,我正在传递该板的地址。
stringToGame(&board, &rows, &cols, &turn, &winLength);
传递电路板的地址导致分段错误,我不明白为什么。
作为第二个问题,我是否需要在购买新的二维数据库之前将其旧的2D数组释放出来?
答案 0 :(得分:1)
此
*board[i] = malloc(*cols * sizeof(char));
应该是
(*board)[i] = malloc(*cols * sizeof(char));
因为数组下标运算符[]
具有比间接运算符*
更高的优先级,因此将首先执行,但您需要相反的情况发生,即首先*
,然后{{ 1}}。
答案 1 :(得分:0)
首先,你声明的不是2-d array
,它是一个双指针。这两者之间有difference。
其次,您不需要将数组的地址传递给函数,因为数组无论如何都是通过引用传递的。在malloc-it后,你可以简单地将一个双指针传递给你的函数。
stringToGame(board, &rows, &cols, &turn, &winLength);
对于你的第二个问题的答案,是的,你应该先free
你的旧指针,然后再将它复制,否则你的程序会有内存泄漏。 board
的第一个值将丢失,您将无法释放它。