在Struct内部的指向Struct的Free()指针

我似乎无法找到如何free()子结构。

结构:

typedef struct { char ID[5]; location *loc; } observer; typedef struct { double lat; double lng; } location; 

我的Free()Wrapper是:

 void free_obs_list_node(void *data) { free(*(observer **)data); } 

我可以释放观察者结构。 我无法释放指向结构位置的指针。 这是我的问题:如何释放location *loc;指向的location结构location *loc;

我使用了free()的包装器,因为这些是通用链表中的节点。

free函数将void*作为参数,因此强制转换不计算。 您只需要指向要释放的内存位置:

 free(data->loc); 

释放observer 之后你无法释放loc ,但在你释放它之前, loc是一个公平的游戏:

 void free_obs_list_node(void *data) { observer **p = data; free((*p)->loc); free(*p); *p = NULL; } 

当然,这假设您在void* data中传递一个指向observer指针的指针。 由于将指针指针传递给释放指向指针的函数的唯一有效理由是将指针设置为NULL ,因此我将最后一行添加为null *p

但是,不清楚为什么你传递void *而不是observer **

您应该确保代码中的数据不为空,或者在访问空指针时很容易出现段错误。

我不明白为什么你使用双指针,它使代码更复杂,容易出错。 以下代码应该有效:

 void free_obs_list_node(void *data) { observer **ob = (observer **)data;// do not understand why you use a double pointer, it makes code much more complex and bug prone if(NULL == ob || NULL == *ob) return; if(NULL != (*ob)->loc) free((*ob)->loc); free(*ob); }