我正在做一些 C 练习(新手),我遇到了一点问题。我得到了一个先进先出队列,并被告知将删除函数修改为 FILO。
当我省略 free((void *) p) 时,这很好用; while 循环内的行,我从以前的方法中获取了这一行。谁能告诉我为什么有这条线时它不起作用?我猜我不能完全删除它是因为内存泄漏?
/* remove next Item from queue, placing it in the 2nd argument;
* return 1/0 if successful/queue empty */
int q_remove(Queue *q, Item i) {
struct q_element *p;
if (q->head == NULL)
return 0;
if(q->head==q->tail){
p=q->head;
q->head=NULL;
q->tail=NULL;
memcpy(i, p->value, q->size);
free(p->value);
free((void *) p);
return 1;
}
p=q->head;
while(p != NULL){
if(p->next==q->tail){
memcpy(i, p->next->value, q->size);
free(p->next->value);
q->tail=p;
q->tail->next=NULL;
free((void *) p);
return 1;
}
p=p->next;
}
return 0;
}
最佳答案
问题是你在下一行代码中指向了你要释放的东西:
q->tail=p;
...
free((void *) p);
现在,当您尝试访问 q->tail 时,您会收到错误消息,因为您已经释放了该内存。
你应该尝试 free p->next 而不是 p(因为 p->next 是你队列中的最后一项 - 所以这是你想要取出的那个)
祝你好运:)
关于c - 在 C 中使用 free(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5732182/