linux下c语言队列,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=%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):

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

回复讨论(解决方案)

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

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

仅供参考#ifndef __PQUEUE_H__

#define __PQUEUE_H__

#include

#include

#include

#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 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.多线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一线程继续对该对象进行操作。

加个线程同步 应该就没有问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值