Linux下关于C语言队列问题的详解

最近写程序用到了linux系统下c语言的队列操作,于是有了下面一个问题 
下面是队列的代码: 
这个队列头文件 

extern struct pqueue Que;    /*构造一个空队列*/  extern pQueue *InitQueue();    /*销毁一个队列*/  extern void DestroyQueue(pQueue *pqueue);    /*清空一个队列*/  extern void ClearQueue(pQueue *pqueue);    /*判断队列是否为空*/  extern int IsEmpty(pQueue *pqueue);    /*返回队列大小*/  extern int GetSize(pQueue *pqueue);    /*返回队头元素*/  extern PNode GetFront(pQueue *pqueue,char *pitem);    /*返回队尾元素*/  extern PNode GetRear(pQueue *pqueue,char *pitem);    /*将新元素入队*/  extern PNode InQueue(pQueue *pqueue,char *pitem);    /*队头元素出队*/  extern PNode OutQueue(pQueue *pqueue,char *pitem);

下面是队列函数 

struct pqueue Queue;		        	/*构造一个空队列*/    	pQueue *InitQueue()    	{    		pQueue *pqueue = (pQueue *)malloc(sizeof(Queue));    		if(pqueue!=NULL)    		{    			pqueue->front = NULL;    			pqueue->rear = NULL;    			pqueue->size = 0;    		}    		return pqueue;    	}        	/*销毁一个队列*/    	void DestroyQueue(pQueue *pqueue)    	{    		if(IsEmpty(pqueue)!=1)    			ClearQueue(pqueue);    		free(pqueue);    	}    	    	/*清空一个队列*/    	void ClearQueue(pQueue *pqueue)    	{    		while(IsEmpty(pqueue)!=1)    		{    			OutQueue(pqueue,NULL);    		}    	    	}    	    	/*判断队列是否为空*/    	int IsEmpty(pQueue *pqueue)    	{    		if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)    			return 1;    		else    			return 0;    	}    	    	/*返回队列大小*/    	int GetSize(pQueue *pqueue)    	{    		return pqueue->size;    	}    	    	/*返回队头元素*/    	PNode GetFront(pQueue *pqueue,char *pitem)    	{    		if(IsEmpty(pqueue)!=1)    		{    			//pitem = pqueue->front->data;    		strcpy(pitem,pqueue->front->data);    		}    		return pqueue->front;    	}    	    	/*返回队尾元素*/    	    	PNode GetRear(pQueue *pqueue,char *pitem)    	{    		if(IsEmpty(pqueue)!=1)    		{    			//pitem = pqueue->rear->data;    		strcpy(pitem,pqueue->rear->data);    		}    		return pqueue->rear;    	}    	    	/*将新元素入队*/    	PNode InQueue(pQueue *pqueue,char *pitem)    	{    	//DBG0_PR("dbg QueueIn front=%d, rear=%d, count=%dn", pqueue->front, pqueue->rear, pqueue->size);    		PNode pnode = (PNode)malloc(sizeof(Node));    		if(pnode != NULL)    		{    			strcpy(pnode->data, pitem);    			pnode->next = NULL;    	    			if(IsEmpty(pqueue))    			{    				pqueue->front = pnode;    			}    			else    			{    				pqueue->rear->next = pnode;    			}    			pqueue->rear = pnode;    			pqueue->size++;    		}    		return pnode;    	}    	    	/*队头元素出队*/    	PNode OutQueue(pQueue *pqueue,char *pitem)    	{    		PNode pnode = pqueue->front;    		if(IsEmpty(pqueue)!=1 && pnode!=NULL)    		{    			if(pitem!=NULL)    				strcpy(pitem,pnode->data);    			//pitem = pnode->data;    			pqueue->front = pnode->next;    			free(pnode);    			pqueue->size = pqueue->size - 1;    			if(pqueue->size == 0 ){    				pqueue->rear = NULL;    			}    		}    		return pqueue->front;    	}

问题在使用队列的outque时,描述如下: 
入队操作,队列大小size为1,出队操作队列大小操作为0,然后程序循环一圈回来再判断队列大小,size值变成了393216,改了半天也不知道怎么回事, 

提示错误是这样的 

*** glibc detected ***      double free or corruption (!prev):

如果哪位大虾看见了,求解答或者给个思路,感觉自己已经进了死胡同了,跪谢!!!!

回复讨论(解决方案)

注释掉一部分代码,如果问题消失,问题就出在注释掉的代码里

立即学习C语言免费学习笔记(深入)”;

实时打印size的值,看在哪一步出现的异常

仅供参考 

#ifndef __PQUEUE_H__  #define __PQUEUE_H__    #include <stdio.h>  #include <stdlib.h>  #include <string.h>    #define MAX_DATA_SIZE 256    typedef struct _node {  	char data[MAX_DATA_SIZE];  	struct _node* next;  } Node, *pNode;    typedef struct __pqueue {  	pNode front;  	pNode rear;  	int size;  } Queue, *pQueue;    /*构造一个空队列*/  extern pQueue InitQueue();    /*销毁一个队列*/  extern void DestroyQueue(pQueue pqueue);    /*清空一个队列*/  extern void ClearQueue(pQueue pqueue);    /*判断队列是否为空*/  extern int IsEmpty(pQueue pqueue);    /*返回队列大小*/  extern int GetSize(pQueue pqueue);    /*返回队头元素*/  extern int GetFront(pQueue pqueue, char *pitem);    /*返回队尾元素*/  extern int GetRear(pQueue pqueue, char *pitem);    /*将新元素入队*/  extern int InQueue(pQueue pqueue, char *pitem);    /*队头元素出队*/  extern int OutQueue(pQueue pqueue, char *pitem);    #endif /* __PQUEUE_H__ */    ////////////////////////////////////////////////////////  #include "pqueue.h"		    #define err_log(fmt, ...) printf("[%s:%d]"fmt"n", __FUNCTION__, __LINE__, ##__VA_ARGS__)  #define err_assert(con) {   	if (!(con)) {   		printf("[%s:%d]ASSERT&gt;&gt;&gt; %s failedn", __FUNCTION__, __LINE__, #con);   		abort();   	}   }  		    /*构造一个空队列*/  pQueue InitQueue()  {  	return (pQueue)calloc(1, sizeof(Queue));  }    /*销毁一个队列*/  void DestroyQueue(pQueue pqueue)  {  	err_assert(pqueue != NULL);  	  	if(!IsEmpty(pqueue))  		ClearQueue(pqueue);    	free(pqueue);  }    /*清空一个队列*/  void ClearQueue(pQueue pqueue)  {  	err_assert(pqueue != NULL);  	  	while (!IsEmpty(pqueue)) {  		OutQueue(pqueue, NULL);  	}  }    /*判断队列是否为空*/  int IsEmpty(pQueue pqueue)  {  	err_assert(pqueue != NULL);  	  	return !pqueue-&gt;size;  }    /*返回队列大小*/  int GetSize(pQueue pqueue)  {  	err_assert(pqueue != NULL);  	  	return pqueue-&gt;size;  }    /*返回队头元素*/  int GetFront(pQueue pqueue, char *pitem)  {  	err_assert(pqueue != NULL);  	  	if (IsEmpty(pqueue)) {  		return -1;  	}    	if (pitem) {  		err_assert(pqueue-&gt;front != NULL);  		strcpy(pitem, pqueue-&gt;front-&gt;data);  	}  	  	return 0;  }    /*返回队尾元素*/	  int GetRear(pQueue pqueue, char *pitem)  {  	err_assert(pqueue != NULL);  	  	if (IsEmpty(pqueue)) {  		return -1;  	}    	if (pitem) {  		err_assert(pqueue-&gt;rear != NULL);  		strcpy(pitem,pqueue-&gt;rear-&gt;data);  	}  	return 0;  }    /*将新元素入队*/  int InQueue(pQueue pqueue, char *pitem)  {  	err_assert(pqueue != NULL);  	  	pNode pnode = (pNode)calloc(1, sizeof(Node));  	if(NULL == pnode)  {  		return -1;  	}    	strcpy(pnode-&gt;data, pitem);  	pnode-&gt;next = NULL;  	if(IsEmpty(pqueue)) {  		pqueue-&gt;front = pnode;  	}  	else {  		pqueue-&gt;rear-&gt;next = pnode;  	}    	pqueue-&gt;rear = pnode;  	pqueue-&gt;size++;    	return 0;  }    /*队头元素出队*/  int OutQueue(pQueue pqueue,char *pitem)  {  	err_assert(pqueue != NULL);  	  	pNode pnode = pqueue-&gt;front;    	if (IsEmpty(pqueue)) {  		err_log("empty queue");  		return -1;  	}  	  	if (pitem)  		strcpy(pitem, pnode-&gt;data);    	pqueue-&gt;front = pnode-&gt;next;  	free(pnode);  	pqueue-&gt;size--;    	if (pqueue-&gt;size == 0 ){  		pqueue-&gt;rear = NULL;  	}    	return 0;  }    ////////////////////////////////////////////////////////  #include "pqueue.h"		    int main(void)  {  	pQueue queue = NULL;    	queue = InitQueue();    	InQueue(queue, "I'm ");  	InQueue(queue, "a ");  	InQueue(queue, "boy. ");    	while (!IsEmpty(queue)) {  		char buf[MAX_DATA_SIZE];  		if (OutQueue(queue, buf) <p><span style="color: rgb(51, 51, 51); font-family: arial, " microsoft yahei sans-serif font-size: background-color: rgb><p>找到问题了,不是队列的原因,我在一个函数里面malloc了一个char*,然后在线程中调用该函数返回的这个char*,用完之后free(在该功能尾部),结果就报上面的错误了,我注释掉这句free之后就没事了,不解的是不知道为啥不能free</p> <p>free应该放在你写malloc的函数里面</p> <p>*** glibc detected ***      double free or corruption (!prev): <br>通常是指操作已释放的对象,如: <br>1.已释放对象,却再次操作该指针所指对象。 </p> <p>2.多线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一线程继续对该对象进行操作。</p> <p>加个线程同步 应该就没有问题</p></span></p></string.h></stdlib.h></stdio.h>

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享