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



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

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

bif指向前一个元素,所以你不要free(),因为我认为它没有必要的

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

稍后我需要释放内存。我不知道什么方式是正确的

调用带有列表的limiar

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

用&列出

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

如果您通过引用传递列表(第二个选项),您将能够清除调用方数据中指向列表的指针,或者至少清除其中一个。虽然它不是严格必要的,也不是完美的解决方案,但它是一种良好的编程风格,并降低了引用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.

最新更新