【问题标题】:Trying to access address of 2D array in C and getting segmentation fault尝试在 C 中访问二维数组的地址并出现分段错误
【发布时间】:2017-02-23 01:00:13
【问题描述】:

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

// 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);

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

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

【问题讨论】:

  • 如果你有一个专门的函数来分配/重新分配板子,它会让你的代码更容易管理。
  • @M.M 这就是我的计划,只要我可以让它工作!

标签: c pointers multidimensional-array memory-address


【解决方案1】:

这个

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

应该是

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • stringToGame 函数会重新分配板,因此通过值传递board 将不起作用
    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2023-04-10
    • 2017-04-18
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多