我正在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);
}
答案 0 :(得分:3)
免费声明确实没有用。
在此声明中:
q->tail = q->tail->next = newNode;
您将指针newnode
分配给两个指针变量。但是在下一条语句中
free(newNode);
您使该指针无效,因此取消引用(或释放)存储在q->tail
中的指针以及列表中倒数第二个元素的下一个指针会导致不确定的行为。
解决方案是不在过程中存在对指针的有效引用时释放指针。