在 C 中使用 malloc 初始化结构
Initialize struct with malloc in C
所以我有一个我认为是菜鸟的问题。提前抱歉,语法方面英语不是我的主要语言。
所以我必须做一个跳棋游戏。我有一些结构,由
定义
struct game {
int **board;
int xsize, ysize;
struct move *moves;
int cur_player;
};
struct coord {
int x, y;
};
struct move_seq {
struct move_seq *next;
struct coord c_old;
struct coord c_new;
int piece_value;
struct coord piece_taken;
int old_orig;
};
struct move {
struct move *next;
struct move_seq *seq;
};
而且我必须用函数初始化一个结构游戏
struct game *new_game(int xsize, int ysize)
所以,这是我的问题。现在,我调用 new_game 始终使用 xsize 和 ysize 的 10 和 10 值。然后我初始化棋盘游戏,稍后我要分配它。
int black = 1;
int white = 5;
int **board;
int i;
int j;
int k;
for(i=0;i<xsize;i++)
{
for(j=0;j<ysize;j++)
{
if(i<(xsize/2) && j<(ysize/2) && (i+j)%2!=0)
{
board[i][j] = black;
}
else if(i>(xsize/2) && j>(ysize/2) && (i+j)%2!=0)
{
board[i][j] = white;
}
else board[i][j] = 0;
}
}
struct game *new = malloc (sizeof(struct game *));
if (new == NULL) return NULL;
所以,我的问题是在那之后。无论我对 struct new 做什么,我都会出现分段错误。
我试着分配 new->xsize = xsize 和 ysize 一样。我为板和结构移动做了一个 malloc,就像我学会的那样,但我一直收到分段错误的错误。
所以这是我真正的问题:如何正确分配和初始化结构?我是否必须为 struct game 的每个成员创建一个 malloc? (我也试过了,但没有成功...)
我不一定只想要答案,我更愿意真正了解在这种情况下以及一般情况下我必须做什么,以便将来少犯错误。
在此先感谢您的帮助。
祝你有美好的一天。
发生这种情况是因为您只为 struct
的 指针 分配了 space。您需要做的是为它的整个大小分配它:
struct game *new = malloc (sizeof(struct game));
编辑:不要被 malloc 的 return 值误导,因为它 return 是指向分配的 space 的指针,这就是为什么它应该是 struct game *new
原样
除了迈克尔的bug修复,我还想知道板子:它没有分配,但你写给它。我认为应该是这样的:
struct game *new_game(int xsize, int ysize)
{
int black = 1;
int white = 5;
int i;
int j;
struct game *new = malloc (sizeof(struct game));
if (new == NULL) return NULL;
game->xsize= xsize;
game->ysize= ysize;
game->board= malloc(xsize*ysize*sizeof(int));
for(i=0;i<xsize;i++)
{
for(j=0;j<ysize;j++)
{
if(i<(xsize/2) && j<(ysize/2) && (i+j)%2!=0)
{
game->board[i*xsize+j] = black;
}
else if(i>(xsize/2) && j>(ysize/2) && (i+j)%2!=0)
{
game->board[i*xsize+j] = white;
}
else game->board[i*xsize+j] = 0;
}
}
return (game);
}
另请注意数组索引:编译器不知道动态行大小,因此您必须自己做。
所以我有一个我认为是菜鸟的问题。提前抱歉,语法方面英语不是我的主要语言。
所以我必须做一个跳棋游戏。我有一些结构,由
定义struct game {
int **board;
int xsize, ysize;
struct move *moves;
int cur_player;
};
struct coord {
int x, y;
};
struct move_seq {
struct move_seq *next;
struct coord c_old;
struct coord c_new;
int piece_value;
struct coord piece_taken;
int old_orig;
};
struct move {
struct move *next;
struct move_seq *seq;
};
而且我必须用函数初始化一个结构游戏
struct game *new_game(int xsize, int ysize)
所以,这是我的问题。现在,我调用 new_game 始终使用 xsize 和 ysize 的 10 和 10 值。然后我初始化棋盘游戏,稍后我要分配它。
int black = 1;
int white = 5;
int **board;
int i;
int j;
int k;
for(i=0;i<xsize;i++)
{
for(j=0;j<ysize;j++)
{
if(i<(xsize/2) && j<(ysize/2) && (i+j)%2!=0)
{
board[i][j] = black;
}
else if(i>(xsize/2) && j>(ysize/2) && (i+j)%2!=0)
{
board[i][j] = white;
}
else board[i][j] = 0;
}
}
struct game *new = malloc (sizeof(struct game *));
if (new == NULL) return NULL;
所以,我的问题是在那之后。无论我对 struct new 做什么,我都会出现分段错误。
我试着分配 new->xsize = xsize 和 ysize 一样。我为板和结构移动做了一个 malloc,就像我学会的那样,但我一直收到分段错误的错误。
所以这是我真正的问题:如何正确分配和初始化结构?我是否必须为 struct game 的每个成员创建一个 malloc? (我也试过了,但没有成功...)
我不一定只想要答案,我更愿意真正了解在这种情况下以及一般情况下我必须做什么,以便将来少犯错误。
在此先感谢您的帮助。
祝你有美好的一天。
发生这种情况是因为您只为 struct
的 指针 分配了 space。您需要做的是为它的整个大小分配它:
struct game *new = malloc (sizeof(struct game));
编辑:不要被 malloc 的 return 值误导,因为它 return 是指向分配的 space 的指针,这就是为什么它应该是 struct game *new
原样
除了迈克尔的bug修复,我还想知道板子:它没有分配,但你写给它。我认为应该是这样的:
struct game *new_game(int xsize, int ysize)
{
int black = 1;
int white = 5;
int i;
int j;
struct game *new = malloc (sizeof(struct game));
if (new == NULL) return NULL;
game->xsize= xsize;
game->ysize= ysize;
game->board= malloc(xsize*ysize*sizeof(int));
for(i=0;i<xsize;i++)
{
for(j=0;j<ysize;j++)
{
if(i<(xsize/2) && j<(ysize/2) && (i+j)%2!=0)
{
game->board[i*xsize+j] = black;
}
else if(i>(xsize/2) && j>(ysize/2) && (i+j)%2!=0)
{
game->board[i*xsize+j] = white;
}
else game->board[i*xsize+j] = 0;
}
}
return (game);
}
另请注意数组索引:编译器不知道动态行大小,因此您必须自己做。