C中的链接列表错误-free():无效的指针错误或分段错误

时间:2019-03-27 02:11:09

标签: c memory-leaks

我正在c中创建一个链表,无法在4号之后添加另一个节点。当我使用free(node)时,出现错误:     free():无效的指针     中止(核心已弃用) 但是,如果删除free(node)声明,则会出现分段错误。我以为这是某种内存问题,但是我找不到问题的根源。

使用的结构:

struct node
{
    int id;
    struct process * p;
    struct node * next;
};

struct queue
{
    struct node * head;
    struct node * tail;
};

应该将节点添加到列表的入队功能:

void enqueue(struct queue * q, struct node * newNode)
{
    if(q->tail == NULL)
    {
        q->head = q->tail = newNode;
        return;
    }

    q->tail = q->tail->next = newNode;

    // free statement useful?
    free(newNode);
}

1 个答案:

答案 0 :(得分:3)

免费声明确实没有用。

在此声明中:

q->tail = q->tail->next = newNode;

您将指针newnode分配给两个指针变量。但是在下一条语句中

free(newNode);

您使该指针无效,因此取消引用(或释放)存储在q->tail中的指针以及列表中倒数第二个元素的下一个指针会导致不确定的行为。

解决方案是在过程中存在对指针的有效引用时释放指针。