我正在尝试删除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);
有谁知道问题是什么?
提前致谢。
答案 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;