访问分配的内存而不会出现分段错误

时间:2019-03-15 22:47:47

标签: c

我正在尝试为井字游戏创建一个字符矩阵。我为其分配了内存,但无法访问它。它显示了细分错误,但我似乎无法弄清楚原因。

   #include <stdio.h>
   #include <stdlib.h>

   //function to make a char matrix 
   void make_board (char** board)
   {
       board = malloc(sizeof(char*)*3);
       for(int i=0;i<3;i++)
       {
           board[i] = malloc(sizeof(char)*3);
       }
       for(int i=0;i<3;i++)
       {
           for(int j=0;j<3;j++)
           {
               board[i][j]='x';
           }
       }
   }

    //main function
    int main ()
    {
        char ** board;
        make_board(board);

        /*when i try to access it it show me a segmentation fault*/
        printf("%c\n",**board);
    }

2 个答案:

答案 0 :(得分:1)

您的代码引发分段错误的原因与将char数组的指针传递到函数中的方式有​​关。在make_board中,通过使用malloc重新分配可变板,您将告诉计算机“使板指向字符数组”。这听起来像可行,但是当您执行此操作时,您只是在 make_board中重新分配了可变板。总的来说,变量板保持不变,因为将变量复制到c中的函数中,而不是通过具有编辑能力的函数来传递。代码的另一个问题是,在将变量板传递到make_board之前,您永远不会对其进行初始化,因此您传入的是0x0,或者由计算机解释为什么都没有。

为帮助您理解,这是计算机在该程序中的功能的播放(请记住,这是假设您在主程序中添加了分配主板的行):

  • 第1步:(进入main)用户想要一个以char **命名的板。我将对其进行分配,使其指向地址0x1234123412341234。
  • 第2步:好的,现在我应该将board传递到make_board中。 (请记住,它会传递0x1234123412341234,而不会传递其他任何内容。)
  • 第3步:(输入make_board)好吧,用户希望将board分配给3个char *类型,因此我将board分配给0x1234567812345678。

这是出问题的地方。您的其余代码工作正常,但是当您再次输入main时,board仍为0x1234123412341234,而不是0x1234567812345678的值。这样,当您打印** board时,它从未被分配并且什么也没有指向,从而引发了分段错误。

这是我的代码,它通过传入char *** board_ptr来解决此问题,它使make_board可以创建其参数指向的char **而无需对其进行更改。

#include <stdio.h>
#include <stdlib.h>

//function to make a char matrix
void make_board(char*** board_ptr)
{
        *board_ptr = calloc(3, sizeof(char*));
        char **board = *board_ptr;
        for (int i = 0; i < 3; i++) {
                board[i] = calloc(3, sizeof(char));
        }
        for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                        board[i][j]='x';
                }
        }
}

//main function
int main(int argc, char *argv[])
{
        char ***board_ptr = calloc(1, sizeof(char**));
        char **board;

        make_board(board_ptr);
        board = *board_ptr;

        printf("%c\n", **board);/* Now it works! */
}

答案 1 :(得分:0)

您可以在make_board中更改board变量,但是要通过值传递它,因此在main函数中不会对其进行更改。您尝试将ffboard变量printf(已用垃圾初始化),从而收到分段错误。您应该从make_board:char **board = make_board()返回指针。或通过指针传递板变量:make_board(&board)