在Struct内部的结构的Free()指针

时间:2014-12-09 15:07:25

标签: c pointers struct linked-list generic-list

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

的Structs:

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

typedef struct
{
    double lat;
    double lng;
} location;

我的自由包装()是:

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

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

指向的location *loc;结构

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

3 个答案:

答案 0 :(得分:2)

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

free(data->loc);

答案 1 :(得分:2)

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

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

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

但是,目前尚不清楚为什么通过void *代替observer **

答案 2 :(得分:2)

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

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

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