我有如下结构:
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)
......
}
但是我很确定它不会这样做。控制它的最佳方法是什么?
答案 0 :(得分: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;
};
答案 1 :(得分:0)
使用它:
lmv.lastmover=malloc(sizeof(player));