簡體   English   中英

在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的10和10值設為ysize。 然后,我初始化棋盤游戲,稍后再分配。

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做什么,我都遇到了Segmentation Fault。

我試圖分配new-> xsize = xsize,並且與ysize相同。 像我學過的那樣,我為板和結構移動執行了一個malloc動作,但是我不斷遇到Segmentation Fault的錯誤。

所以這是我真正的問題:如何正確分配和初始化結構? 我是否必須為struct game的每個成員制作一個malloc? (我也嘗試過,但沒有成功...)

我不一定只想得到答案,我更希望真正了解在這種情況下的工作,總的來說,以減少將來的錯誤。

在此先感謝您的幫助。

祝你有美好的一天。

發生這種情況是因為您只為指向 struct指針分配了空間。 您需要做的是為其分配整個大小:

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

編輯:不要被malloc的返回值誤導,因為它返回一個指向分配空間的指針,這就是為什么它應該是struct game *new的原因。

除了Michael的錯誤修復之外,我還想知道板子:它沒有分配,但您可以寫它。 我認為應該是這樣的:

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

還要注意數組索引:編譯器不知道動態行大小,因此您必須自己做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM