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



我正在 c 中创建一个链接列表,无法在第 4 个节点之后添加另一个节点。 当我使用 free(节点) 时,我收到错误: 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);
}

free语句确实没有用。

在此声明中:

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

将指针newnode分配给两个指针变量。但在下一句话中

free(newNode);

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

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

最新更新