C 如何查看结构指针中的结构指针是否已初始化

C 如何查看结构指针中的结构指针是否已初始化,c,pointers,struct,C,Pointers,Struct,我有一个如下所示的结构: 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(playe

我有一个如下所示的结构:

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

但是我很肯定这不行。。控制这种情况的最佳方法是什么

您只分配指针的大小,这

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;
};
使用以下命令:

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

只要确保每次
lastmover
不存在时都显式地将指针
NULL
,它应该可以正常工作。它不应该是
lmv.lastmover=malloc(sizeof(player))(而不是
player*
)?@Als但这就是问题所在,我不知道如何检查
lastmover
是否存在,但我已经运行了代码,并且它确实有效。我从不给最后一个移动者分配玩家类型。我只给它分配指针。这不好吗?@patriques如果你只分配指针,那么你根本不需要分配内存。事实上,如果你分配内存并将其分配给指针,然后覆盖指针(使其指向别处),那么你就“泄漏”了分配的内存。另外:学会爱上
valgrind
。试着学会爱上gdb,但也许valgrind更好?更好的习惯用法是使用
lmv.lastmover=malloc(sizeof*lmv.lastmover)而不是
lmv.lastmover=malloc(sizeof(player))。即使
lastmover
的类型发生变化,它也会一直工作。对不起,我忘了说lmv现在是指向lastmover的指针。我更新了这个问题,但感谢您指出一个更好的习惯用法是使用
lmv.lastmover=malloc(sizeof*lmv.lastmover)而不是
lmv.lastmover=malloc(sizeof(player))。即使
lastmover
的类型发生变化,它也会一直工作。