最近写程序用到了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;elsereturn 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=%d\n", 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 #include #include #define MAX_DATA_SIZE 256typedef 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 failed\n", __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) < 0) {break;}printf("%s", buf);}printf("\n");DestroyQueue(queue);return 0;}
找到问题了,不是队列的原因,我在一个函数里面malloc了一个char*,然后在线程中调用该函数返回的这个char*,用完之后free(在该功能尾部),结果就报上面的错误了,我注释掉这句free之后就没事了,不解的是不知道为啥不能free
free应该放在你写malloc的函数里面
*** glibc detected *** double free or corruption (!prev):
通常是指操作已释放的对象,如:
1.已释放对象,却再次操作该指针所指对象。
2.多线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一线程继续对该对象进行操作。
加个线程同步 应该就没有问题
以上就是Linux下关于C语言队列问题的详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/192127.html
微信扫一扫
支付宝扫一扫