gpt4 book ai didi

c - 这个错误是什么意思 : "free(): double free detected in tcache 2"

转载 作者:行者123 更新时间:2023-12-04 14:07:23 70 4
gpt4 key购买 nike

#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_list

void free_list(node_t* head) {
node_t* temp = head;
while(head != NULL) {
free(temp);
temp = head;
head = head -> next;
}
}
您正在删除指向头节点的指针所指向的内存两次。
在循环的第一次迭代中,您将删除指向头节点的指针所指向的内存
    node_t* temp = head;
while(head != NULL) {
free(temp);
//...
并且在循环的第二次迭代中,由于此分配,您正在执行相同的操作
temp = head;
而且这个说法
head = head -> next;
调用未定义的行为,因为使用了指向已释放内存的指针。
该函数至少应按以下方式定义
void free_list(node_t* head) {
while(head != NULL) {
node_t* temp = head;
head = head -> next;
free(temp);
}
}
虽然定义函数会更好
void free_list(node_t **head) {
while( *head != NULL ) {
node_t* temp = *head;
*head = ( *head ) -> next;
free(temp);
}
}
该函数被称为
free_list( &head );
在这种情况下,在调用函数后指针 headmain将等于 NULL .

关于c - 这个错误是什么意思 : "free(): double free detected in tcache 2",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67359233/

70 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com