最近寫程序用到了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>>>?%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->size; } /*返回隊列大小*/ int?GetSize(pQueue?pqueue) { err_assert(pqueue?!=?NULL); return?pqueue->size; } /*返回隊頭元素*/ int?GetFront(pQueue?pqueue,?char?*pitem) { err_assert(pqueue?!=?NULL); if?(IsEmpty(pqueue))?{ return?-1; } if?(pitem)?{ err_assert(pqueue->front?!=?NULL); strcpy(pitem,?pqueue->front->data); } return?0; } /*返回隊尾元素*/ int?GetRear(pQueue?pqueue,?char?*pitem) { err_assert(pqueue?!=?NULL); if?(IsEmpty(pqueue))?{ return?-1; } if?(pitem)?{ err_assert(pqueue->rear?!=?NULL); strcpy(pitem,pqueue->rear->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->data,?pitem); pnode->next?=?NULL; if(IsEmpty(pqueue))?{ pqueue->front?=?pnode; } else?{ pqueue->rear->next?=?pnode; } pqueue->rear?=?pnode; pqueue->size++; return?0; } /*隊頭元素出隊*/ int?OutQueue(pQueue?pqueue,char?*pitem) { err_assert(pqueue?!=?NULL); pNode?pnode?=?pqueue->front; if?(IsEmpty(pqueue))?{ err_log("empty?queue"); return?-1; } if?(pitem) strcpy(pitem,?pnode->data); pqueue->front?=?pnode->next; free(pnode); pqueue->size--; if?(pqueue->size?==?0?){ pqueue->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