C中指向结构的指针未编译的Free()函数
我已经实现了一个linkedlist,我正在尝试创建一个函数,该函数从linkedlist的开头开始,基本上将指向结构的指针存储在curr中。然后它使用free()…不幸的是,我一直C中指向结构的指针未编译的Free()函数,c,pointers,free,C,Pointers,Free,我已经实现了一个linkedlist,我正在尝试创建一个函数,该函数从linkedlist的开头开始,基本上将指向结构的指针存储在curr中。然后它使用free()…不幸的是,我一直 LinkedList_头(27343,0x1000dedc0)malloc:**对象0x1007b42c0的错误:未分配要释放的指针 struct node { int data; struct node* next; }; struct node* initialize(int input){
LinkedList_头(27343,0x1000dedc0)malloc:**对象0x1007b42c0的错误:未分配要释放的指针
struct node {
int data;
struct node* next;
};
struct node* initialize(int input){
struct node* head = (struct node*)malloc(sizeof(struct node));
head->data = input;
head->next = NULL;
return head;
}
void freeing(struct node* head){
struct node* curr = head;
while(curr->next != NULL){
free(curr);
}
free(curr);
}
代码的问题是
释放
功能不正确。函数有两种可能的失败方式
双重自由
头
在下一个
指针上有一个有效指针,则释放函数将在相同的初始指针(头)上保持循环。这将创建一个双空闲,因此您正在释放一个未分配的指针//如果不是因为双重自由,它将永远循环。
//循环永远不会继续到下一个指针,而是停留在头部。
结构节点*curr=head;
while(当前->下一步!=NULL){
免费(货币);
}
从不通过链接列表进行集成
while
循环将始终在头部迭代,如果不是因为双自由,循环将永远迭代void freeing(struct node* head){
struct node* curr = head;
struct node* next;
while(curr != NULL){
next = curr->next;
free(curr);
curr = next;
}
}
Freeing: 23
Freeing: 42
带测试的整个代码:
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
结构节点*初始化(int输入){
结构节点*头=(结构节点*)malloc(sizeof(结构节点));
头部->数据=输入;
head->next=NULL;
回流头;
}
空洞释放(结构节点*头部){
结构节点*curr=head;
结构节点*下一步;
while(curr!=NULL){
下一步=当前->下一步;
printf(“释放:%d\n”,当前->数据);
免费(货币);
curr=next;
}
}
int main()
{
结构节点*a=初始化(23);
a->next=初始化(42);
释放(a);
}
这就是输出,现在代码避免了双重释放并正确迭代
void freeing(struct node* head){
struct node* curr = head;
struct node* next;
while(curr != NULL){
next = curr->next;
free(curr);
curr = next;
}
}
Freeing: 23
Freeing: 42
代码的问题是
释放
功能不正确。函数有两种可能的失败方式
双重自由
头
在下一个
指针上有一个有效指针,则释放函数将在相同的初始指针(头)上保持循环。这将创建一个双空闲,因此您正在释放一个未分配的指针//如果不是因为双重自由,它将永远循环。
//循环永远不会继续到下一个指针,而是停留在头部。
结构节点*curr=head;
while(当前->下一步!=NULL){
免费(货币);
}
从不通过链接列表进行集成
while
循环将始终在头部迭代,如果不是因为双自由,循环将永远迭代void freeing(struct node* head){
struct node* curr = head;
struct node* next;
while(curr != NULL){
next = curr->next;
free(curr);
curr = next;
}
}
Freeing: 23
Freeing: 42
带测试的整个代码:
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
结构节点*初始化(int输入){
结构节点*头=(结构节点*)malloc(sizeof(结构节点));
头部->数据=输入;
head->next=NULL;
回流头;
}
空洞释放(结构节点*头部){
结构节点*curr=head;
结构节点*下一步;
while(curr!=NULL){
下一步=当前->下一步;
printf(“释放:%d\n”,当前->数据);
免费(货币);
curr=next;
}
}
int main()
{
结构节点*a=初始化(23);
a->next=初始化(42);
释放(a);
}
这就是输出,现在代码避免了双重释放并正确迭代
void freeing(struct node* head){
struct node* curr = head;
struct node* next;
while(curr != NULL){
next = curr->next;
free(curr);
curr = next;
}
}
Freeing: 23
Freeing: 42
您的货币在循环中始终是相同的。在循环中,只要当前节点不为空,保存当前节点的“下一个”指针,释放当前节点,然后生成保存的“下一个”是新的当前节点。您引用的错误似乎不是编译器错误。在让我困惑的“不编译”旁边,你的curr在循环中总是相同的。在循环中,只要当前节点不为空,保存当前节点的“下一个”指针,释放当前节点,然后生成保存的“下一个”是新的当前节点。您引用的错误似乎不是编译器错误。旁边的“不编译”让我很困惑。