在C结构中使用free()的正确方法是什么

时间:2015-03-01 16:14:08

标签: c list memory free

我对C中的结构和自由操作有点混淆。 我必须使用这个结构(我知道不是最好的定义* tList而不是tList,但它必须是那样)

    typedef struct cel{
    int elto;
    struct cel *bif;
    struct cel *next;
} *tList;

bif指向previus元素,所以你不要自由(),因为我认为它不是必要的

Malloc tList list=(tList)malloc(sizeof(struct cel));

后来我需要释放记忆。我不知道哪种方法是正确的

使用列表

调用limpiar
 void limpiar (tList  borrar)
{
    tList aux;
    tList aBorrar;

    for(aBorrar = borrar; aBorrar != NULL; aBorrar = aux)
    {
        aux=aBorrar->next;
        free(aBorrar);
    }  
    return;
}

使用& list

致电limpiar
void limpiar (tList  * borrar)
    {
        tList aux;
        tList aBorrar;

        for(aBorrar = *borrar; aBorrar != NULL; aBorrar = aux)
        {
            aux=aBorrar->next;
            free(aBorrar);
        }  
        return;
    }

1 个答案:

答案 0 :(得分:0)

如果您通过引用传递列表(第二个选项),您将能够清除呼叫者数据中列表的指针,或至少其中一个。虽然它不是绝对必要的,但不是一个完美的解决方案,它是良好的编程风格,并降低了在free或调用free两次后引用单元格的可能性。该功能应该这样修改:

void limpiar(tList *borrar)
{
    tList aux;
    tList aBorrar;

    for (aBorrar = *borrar; aBorrar != NULL; aBorrar = aux) {
        aux = aBorrar->next;
        free(aBorrar);
    }
    *borrar = NULL;
}
在调用者中,您将以这种方式调用limpiar

limpiar(&list);
// list is NULL now.