C-在remove函数中的free()时或之后崩溃
我用c写了一个队列 在函数remove中,当我尝试释放节点的内存时,程序崩溃。 这是函数remove的代码:C-在remove函数中的free()时或之后崩溃,c,C,我用c写了一个队列 在函数remove中,当我尝试释放节点的内存时,程序崩溃。 这是函数remove的代码: 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;
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'd指针,那么我想您应该指向它,而不是像您那样创建它的副本。像这样:
NodeQ *tmp = a->First;
然后你就可以释放它了
当然,若a->First
不是malloc'd指针,那个么您就并没有呼叫自由
编辑
在看到结构定义之后,First
甚至不是指针!你不能打电话给malloc
或者您可以使用解引用操作符获取存储在其中的内容,如下所示:
*malloc
,当您释放它时,获取它的地址,如下所示:free(&a->First)
您需要整个程序来理解哪里出了问题。你是用gcc-Wall-g编译的吗?您是否使用了调试器gdb
?你用过吗。您可能有或内存泄漏。不,至少在没有结构声明和向队列中添加内容的代码的情况下是这样。在free
中发生崩溃通常意味着您在一段时间之前损坏了堆。正如已经提到的:是时候打破valgrind了。即使有了编辑,我们也不能告诉你你做错了什么。你可能必须自己去发现。你处理最后一个的方式不一致。为什么在插入第一个元素时不设置它?a->first是指向NodeQ的指针,NodeQ也是指向相同元素的指针thing@user2747228:atypedef
不是指针,加上a->First
甚至不是指针a->First是NodeQ类型,我使用typedef做的是NodeQ是指向NodeQ的指针