试图在C中访问2D数组的地址并获得分段错误

时间:2017-02-23 01:00:13

标签: c pointers multidimensional-array memory-address

我是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数组释放出来?

2 个答案:

答案 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的第一个值将丢失,您将无法释放它。