无法免费链接列表

时间:2013-11-20 14:12:32

标签: c

这是结构:

typedef struct listeEle {
    int pos;
    struct listeEle *next;
} ListEle;

这是我创建列表的地方:

ListEle *mokli(int n){
    if(n<=0)
    {
        fprintf(stderr, "Falscher Parameter für mokli... Programm beendet.");
        exit(0);
    }
    else
    {
        ListEle *lst;
        lst = malloc(sizeof(ListEle));
        lst->next = NULL;
        lst->pos = 1;
        int i;
        ListEle *new;
        ListEle *ptr;
        ptr = lst;

        for(i=1; i<n; i++)
        {
            new = NULL;
            new = malloc(sizeof(ListEle));
            new->next = NULL;
            new->pos = i+1;
            ptr->next = new;
            ptr = ptr->next;
        }
        return lst;
    }

}

这就是我试图释放它的地方

void unmokli(ListEle *lst)
{   
    if(lst->next == NULL)
    {
        free(lst);
        lst = NULL;
        printList(lst);
        printf("1 > Liste vollständig gelöscht.\n");
    }
    else
    {
        ListEle *head;
        head = lst;

        int del = 0;
        while(head)
        {
            ListEle *temp = head;
            head = head->next;
            free(temp);

            del+=1;
        }
        free(lst);
        lst = NULL;

        printf("2 > Liste deleted (%d).\n", del);
    }

}

这是我打印它的方式

void printList(ListEle *anfang){
    if(anfang == NULL)
    {
        printf("List not av...\n");
    }
    else
    {
        ListEle *ptr;
        ptr = anfang;
        int i = 1;

        while(ptr)
        {
            printf("Element %i -> ListeEle pos=%i\n", i++, ptr->pos);
            ptr = ptr->next;
        }
    }

}

问题在于主要方法。我在这里创建的列表不会被释放,尽管我将它正确地传递给了释放函数。

int main(void){

    ListEle *liste;
    liste = mokli(6);

    printList(liste);
    unmokli(liste);

    printList(liste);

    return 0;
}

在unmokli之后它应该被完全释放,但主函数内的列表仍然被分配。我怎样才能完全释放清单?

4 个答案:

答案 0 :(得分:1)

当你这样做时

lst = NULL;

在函数unmokli中,您只是本地副本 lst NULL。请记住,参数是按值传递的,即它们被复制。您需要通过引用传递lst,这可以通过传递指针(到指针)来完成:

void unmokli(ListEle **lst)
{
    ...
    *lst = NULL;
    ...
}

然后使用address-of运算符调用它:

unmokli(&liste);

答案 1 :(得分:0)

liste的引用传递给unmokli()或从mokli()中获取返回参数。

在您的情况下,它被释放,但liste中的变量main()未设置为NULL,仍然引用旧内存。这可能会导致您崩溃。

将代码更新为

void unmokli(ListEle **lst_ref)
{   
    ListEle *lst = *lst_ref;

    ...
    //your code freeing list

   //set to null after freeing
   *lst_ref = NULL;
}

main()将其称为

unmokli(&liste);

答案 2 :(得分:0)

它已被释放,但是在免费呼叫后数据仍然存在,因此您只需在删除后通过打印列表访问已删除的数据。 (你实际上不能这样做) 此外,如果要在自由函数内将'liste'指针设置为NULL,则应将指针传递给指针。 unmokli中的以下代码是无用的:

free(lst); // Already freed in a loop before
lst = NULL; // Takes effect only inside this function

答案 3 :(得分:0)

通常,我会释放(&amp; NULL赋值)链接列表,如下所示:

void unmokli(ListEle **lst)
{
    ListEle* nxt;
    if(lst==NULL) return;
    // printList(*lst); // not required by the free-list logic as such...
    while(*lst)
    {
        nxt=(*lst)->next;
        // printList(*lst); // not required by the free-list logic as such... You can test free code with this.
        free(*lst);
        *lst=nxt;
    }
}

//usage
unmokli(&list_head);