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

时间:2014-09-23 13:37:36

标签: c

我在c中写了一个队列 并且在函数中删除当我释放节点的内存时程序崩溃。 这是函数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;
    }
}
}

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

1 个答案:

答案 0 :(得分:0)

它正在崩溃,因为你试图释放那些甚至不存在的动态内存!
free获取指向它应该解除分配的内存位置的指针,并且您将NodeQ对象传递给它。你看到问题出在哪里了?

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

NodeQ *tmp = a->First;

然后你可以释放它。

如果a->First不是指向malloc指针,那么你就不会有免费电话。

修改

看到你的结构定义后,First甚至不是一个指针!你不能为它调用malloc。

或者你可以使用这样的解除引用操作符来获取存储在那里的内容:*malloc当你解除它时,获取它的地址,如下所示:free(&a->First) < / p>