在c-crash中删除链表

时间:2016-04-13 16:33:29

标签: c list linked-list crash

我正在尝试删除PItem列表。这是PItem的声明

typedef struct Item{
    int num;
    float price;
    struct Item* next;
}*PItem;

这是我尝试删除列表的功能

void deleteList(PItem* ptr, PItem *tail){
    PItem *temp;
    while ((*ptr)->next){
        temp = ptr;
        *ptr = (*ptr)->next;
        free(*temp);
    }
    tail = NULL;
}

奇怪的是它只在循环的第二次运行时崩溃,在

之前
free(*temp);

有谁知道问题是什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题是您使用的内存比您需要的多。 temp变量应该是指针,而不是指针的指针。以下是执行此操作时发生的情况:

// Temp points to the same pointer as ptr, so
temp = ptr;
// when the value pointed to by ptr changes, so does the value pointed to by temp
*ptr = (*ptr)->next;
// When you free *temp, you also free *ptr
free(*temp);

解决此问题很简单:将temp声明为PItem,并使用它来复制ptr

PItem temp;
while (*ptr) { // Loop should proceed till *ptr is NULL, not (*ptr)->next
    temp = *ptr; // Copy the pointer's value
    *ptr = temp->next; // Advance *ptr
    free(temp); // Delete temp, which points to the old *ptr
}
// tail is a pointer to a pointer, so you should add * to the assignment
*tail = NULL;