【问题标题】:Initialize struct with malloc in C在 C 中使用 malloc 初始化结构
【发布时间】:2015-03-07 15:36:03
【问题描述】:

所以我有一个我认为是菜鸟的问题。提前抱歉,因为英语不是我的主要语言。

所以我必须做一个跳棋游戏。我有一些结构,由

定义
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)

所以,这是我的问题。现在,我将 xsize 和 ysize 的值称为 new_game 始终为 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,就像我学会做的那样,但我一直收到 Segmentation Fault 的错误。

所以这是我真正的问题:如何正确分配和初始化 struct ?我必须为 struct game 的每个成员制作一个 malloc 吗? (我也试过了,但没有成功...)

我不一定只想要答案,我更愿意真正了解在这种情况下我必须做什么,总的来说,以便将来少犯错误。

提前感谢您的帮助。

祝你有美好的一天。

【问题讨论】:

  • int **board; 这个指向指针的指针永远不会被初始化;它可以指向任何指向任何地方的指针。
  • 'new' 是任何能够处理 C++ 代码的编译器中的保留字,即使代码是 C。因此,强烈建议将名称从 'new' 更改为更有意义的名称不是保留字

标签: c pointers struct malloc


【解决方案1】:

这是因为您只为struct 的指针 分配了空间。您需要做的是为它的整个大小分配它:

struct game *new = malloc (sizeof(struct game));

编辑:不要被 malloc 的返回值误导,因为它返回一个指向分配空间的指针,这就是为什么它应该是struct game *new。

【讨论】:

    【解决方案2】:

    除了迈克尔的错误修复,我还想知道板:它没有分配,但你写给它。我觉得应该是这样的:

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

    还要注意数组索引:编译器不知道动态行大小,所以你必须自己做。

    【讨论】:

    • 在其他地方使用时,我得到一个新的板段故障。它是否按照您向我展示的方式正确分配?当我搜索如何为二维数组分配内存时,我发现了其他方式。就像我使用循环为每行分配内存一样。再次感谢:)
    • 我的板子分配和板子索引是正确的。当你做 new->board = malloc(xsize*sizeof(int **));您为一排指针分配空间(恰好是 int 的大小),但您没有分配整个板。试想:棋盘有多少个方格?并分配那么多内存。
    • 关于索引:您分配了一块线性内存,并且必须将板放置在其中,作为行 (x) 在另一行之后。然后为第 3 行第 2 列寻址,向右移动 2*xsize,然后为该列添加 1(索引从零开始)。注意:索引为 board[i][j] 仅在编译器知道行大小(它不知道)时才有效。
    • board 是一个指向指针的指针,所以这一行:'game->board= malloc(xsizeysizesizeof(int));'是不正确的。 ' 一个可行的方法是 board = malloc (ysize * sizeof(int*)) 然后,在一个循环中,对于每一行, board[row] = malloc( xsize * sizeof(int) ) 当然会检查每个 malloc 是否失败跨度>
    • 是的,也可以。可能会导致尴尬的寻址。
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多