【发布时间】:2021-07-25 07:01:36
【问题描述】:
#include <stdlib.h>
#include <stdio.h>
struct node {
int value;
struct node* next;
};
typedef struct node node_t;
void print_list(node_t *head) {
node_t *temp = head;
while(temp -> next != NULL) {
printf("%d -> ", temp->value);
temp = temp->next;
}
printf("%d ", temp->value);
printf("\n");
}
node_t* create_new_node(int value) {
node_t *temp;
temp = malloc(sizeof(node_t));
temp -> value = value;
return temp;
}
void insert_after_node(node_t *tmp, node_t *newnode) {
newnode -> next = tmp -> next;
tmp -> next = newnode;
}
node_t* find_node(int num, node_t* head) {
node_t *tmp = head;
while(tmp != NULL) {
if(tmp -> value == num)return tmp;
tmp = tmp -> next;
}
return NULL;
}
node_t* delete_head(node_t* head) {
node_t* temp = head;
head = head -> next;
free(temp);
return head;
}
void free_list(node_t* head) {
node_t* temp = head;
while(head != NULL) {
free(temp);
temp = head;
head = head -> next;
}
}
int main(){
node_t *head = NULL;
node_t *temp = NULL;
for(int i = 0; i < 10; i++) {
temp = create_new_node(i);
temp -> next = head;
head = temp;
}
print_list(head);
insert_after_node(
find_node(8, head),
create_new_node(13));
print_list(head);
head = delete_head(head);
print_list(head);
free_list(head);
return 0;
}
输出:
9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0
9 -> 8 -> 13 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0
8 -> 13 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0
free(): double free detected in tcache 2
Aborted (core dumped)
我正在尝试使用 C 实现链表的基本操作。它具有一些基本功能,例如使用 malloc 创建新节点、打印列表、在特定节点之后插入节点、使用 free 释放整个列表。但是得到了错误。谁能告诉我这个错误可能意味着什么。
【问题讨论】:
-
您将相同的指针传递给
free两次。现在是学习如何调试您的程序的好时机。例如,我建议您在监视变量及其值(尤其是跟踪所有指针指向的位置)的同时逐个语句地执行free_list函数语句。 -
感谢 free_list 中的问题。 @Someprogrammerdude
标签: c pointers linked-list free singly-linked-list