C-在remove函数中的free()时或之后崩溃

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;

我用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;
    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:a
typedef
不是指针,加上
a->First
甚至不是指针a->First是NodeQ类型,我使用typedef做的是NodeQ是指向NodeQ的指针