我正在尝试为井字游戏创建一个字符矩阵。我为其分配了内存,但无法访问它。它显示了细分错误,但我似乎无法弄清楚原因。
#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);
}
答案 0 :(得分:1)
您的代码引发分段错误的原因与将char数组的指针传递到函数中的方式有关。在make_board中,通过使用malloc重新分配可变板,您将告诉计算机“使板指向字符数组”。这听起来像可行,但是当您执行此操作时,您只是在 make_board中重新分配了可变板。总的来说,变量板保持不变,因为将变量复制到c中的函数中,而不是通过具有编辑能力的函数来传递。代码的另一个问题是,在将变量板传递到make_board之前,您永远不会对其进行初始化,因此您传入的是0x0,或者由计算机解释为什么都没有。
为帮助您理解,这是计算机在该程序中的功能的播放(请记住,这是假设您在主程序中添加了分配主板的行):
这是出问题的地方。您的其余代码工作正常,但是当您再次输入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)