1

私は次のような構造体を持っています:

typedef struct {
    player *lastmover;
    player *previous;
} lastmove;


typedef struct {
     int moves;
     char *name;
} player;

私はこのようなメモリ割り当てを試してみますので:

lastmove lmv;
lmv.lastmover=malloc(sizeof(player *));
lmv.previous=malloc(sizeof(player *));
.....
callfunction(&lmv);
.....

次に、別の場所でポインターlmvp(lastmover *)を使用して、次のような割り当てを行います。

void
callfuntion(lastmove *)
{
      .....
      lmvp->previous=lmvp->lastmover;
      lmvp->lastmover=p;     //where p is of type (player *)
      .....
}

これはすべて正常に機能しますが、前のムーバーが初期化される天気を制御する方法がわかりません。プログラムの最初のゲーム移動では、lastmover変数(player *)が初期化されますが、NULL(またはガベージ?)に割り当てられた前の変数lmvp->previous=lmvp->lastmover;。しかし、前のムーバーが初期化されているかどうかをどうにかして確認したいと思います。私はこれを試しています:

void
callfunction(lastmove *)
{
     ......
     ......
     if(lmvp->previous!=NULL)
     ......
}

しかし、私はそれがうまくいかないことを確信しています..これを制御するための最良の方法はどうですか?

4

2 に答える 2

2

あなたはポインタのサイズを割り当てているだけです、これは

lmv.lastmover=malloc(sizeof(player *));

する必要があります

lmv.lastmover=malloc(sizeof(player));

これはすべて正常に動作します

それはすべきではありません:)

編集:ポインタを割り当てるだけの場合はlastmover、メモリを割り当てる必要はまったくありません。それ以外の場合はメモリリークです。初期化されているかどうかを確認したい場合は、次に初期化しますNULL

lastmove lmv = {0};
//or
lmv.lastmover= NULL;
lmv.previous= NULL;
...
//later
if(lmv->previous!=NULL)

C99 での 3 番目の方法は、指定された初期化子を使用することです。

lastmove lmv = {
   .lastmover= NULL;
   .previous= NULL;
};
于 2012-11-12T16:59:35.123 に答える
0

これを使って:

lmv.lastmover=malloc(sizeof(player)); 
于 2012-11-12T17:02:32.250 に答える