这是结构:
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之后它应该被完全释放,但主函数内的列表仍然被分配。我怎样才能完全释放清单?
答案 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);