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 中,第三种方法是使用指定的初始值设定项:

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

用这个:

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