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 分享