链表和大小为4的无效读数

时间:2012-08-04 21:44:13

标签: c algorithm data-structures doubly-linked-list

我一直在实施一个链接列表来消除我的开发技能,但是注意到valgrind在我删除中间元素的测试中报告了一个4号无效读取。

==1197== Invalid read of size 4
==1197==    at 0x804885C: main (list.c:135)
==1197==  Address 0x426e76c is 4 bytes inside a block of size 12 free'd
==1197==    at 0x40257ED: free (vg_replace_malloc.c:366)
==1197==    by 0x804875E: list_remove (list.c:112)
==1197==    by 0x8048857: main (list.c:137)

主要触发此问题的代码是:

    for (iter = l2->head; iter; iter = iter->next) {
            if (iter->n >= 10 && iter->n <= 14)
                    list_remove(l2, iter);

删除功能是:

void list_remove(struct list *list, struct node *node)
{
        if (node == list->head && node == list->tail) {
                list->head = list->tail = NULL;
        }
        else if (node == list->head) {
                list->head = node->next;
                list->head->prev = NULL;
        }
        else if (node == list->tail) {
                list->tail = node->prev;
                list->tail = NULL;
        }
        else  {
                struct node *prev, *next;
                prev = node->prev;
                next = node->next;
                prev->next = next;
                next->prev = prev;
        }

        free(node);
}

知道我可能做错了什么?

3 个答案:

答案 0 :(得分:4)

您正在释放循环中的值,然后取消引用它以获取其“下一个”指针。你需要一个临时值才能做到这一点:

    for (iter = l2->head; iter; iter = next) {
            next = iter->next;
            if (iter->n >= 10 && iter->n <= 14)
                    list_remove(l2, iter);
    }

答案 1 :(得分:1)

当您iter时,您正在释放free(node)指针。然后你尝试阅读不再存在的iter->next

答案 2 :(得分:0)

嗯......你所要做的就是阅读 valgrind消息。

  • 此处无效:main (list.c:135) - 即iter->next
  • 来自已释放的位置,此处释放的内存为list_remove (list.c:112),即free(node);

在删除之前,只需缓存下一个指针。