gpt4 book ai didi

C- 在删除函数中的 free() 期间或之后崩溃

转载 作者:行者123 更新时间:2023-11-30 17:28:38 25 4
gpt4 key购买 nike

我用c写了一个队列并且在函数删除中,当我尝试释放节点的内存时,程序崩溃了。这是函数删除的代码:

int RemoveFromQueue(Queue a)
{
int r=0;
printf("test0\n");
if(a->First!=NULL)
{
printf("test1\n");
a->Length=a->Length-1;
r=a->First->DATA;
NodeQ tmp=a->First;
printf("test2\n");
if(tmp==a->Last)
{
a->Last=NULL;
}
printf("test3\n");
a->First=a->First->next_Node;
printf("test4\n");
free(tmp);
printf("test5\n");
}
else
{
return NULL;
}
return r;
}

队列代码:

struct NodeQ_s{
int DATA;
struct NodeQ_s *next_Node;
};
struct Queue_s{
int Length;
NodeQ First;
NodeQ Last;
};

.h 文件:

typedef struct NodeQ_s *NodeQ;
typedef struct Queue_s *Queue;

插入函数:

void InsertToQueue(Queue a,int b)
{
if(a->First==NULL)
{
a->Length=1;
a->First=malloc(sizeof(*(a->First)));
a->First->DATA=b;
a->First->next_Node=NULL;
}
else
{
a->Length=a->Length+1;
NodeQ tmp=malloc(sizeof((*tmp)));
tmp->DATA=b;
if(a->Last==NULL)
{
a->Last=tmp;
a->First->next_Node=a->Last;
}
else
{
a->Last->next_Node=tmp;
a->Last=a->Last->next_Node;
a->Last->next_Node=NULL;
}
}
}

你能告诉我我做错了什么或者为什么崩溃吗?

最佳答案

它正在崩溃,因为您正在尝试释放甚至不存在的动态内存!
free 接受一个指向它应该释放的内存位置的指针,并且您向它传递一个 NodeQ 对象。你看出问题出在哪里了吗?

如果 a->First 是您想要释放的 malloc 指针,那么我猜您想指向它,而不是像您那样创建它的副本。像这样:

NodeQ *tmp = a->First;

然后你就可以释放它了。

当然,如果a->First不是一个malloc指针,那么你就没有空闲调用。

编辑

查看结构定义后,First 甚至不是指针!您不能为其调用 malloc。

或者您可以使用解引用运算符获取其中存储的内容,如下所示:*malloc,当您释放它时,获取其地址,如下所示:free(&a->首先)

关于C- 在删除函数中的 free() 期间或之后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25996590/

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