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
的类型发生变化,它也会一直工作。