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;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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
失控进化巡逻车事件怎么玩-失控进化巡逻车事件玩法攻略
上一篇 2026年9月7日 16:53:49
下一篇 2026年9月7日 16:57:57

相关推荐

  • VSCode设置SSH远程开发(安全连接,跨平台开发指南)

    vscode的ssh远程开发功能通过ssh协议实现本地编辑器与远程服务器的安全连接,让用户能在本地直接操作远程代码,享受与本地一致的开发体验。首先需安装“remote – ssh”扩展并配置~/.ssh/config文件,定义host、hostname、user、port和identit…

    2026年9月22日
    000
  • 【工具分享】坐标转换工具

    内容简介 本文将介绍一个实用的坐标转换工具,帮助用户在GCJ-02和WGS84坐标系之间轻松转换数据。阅读完本文,您将了解如何获取此工具。工具获取方式将在文章末尾详细说明。 工具简介与参数介绍如图所示,工具界面简洁明了,包含三个参数,下面将对这三个参数进行简要介绍。 待转换图层此参数是工具的输入参数…

    2026年9月22日
    100
  • linux远程ssh连接不上?

    昨天下班回到家后,我试图连接linux来部署一个docker项目,却发现无法连接。 我对这类Linux问题的排查能力不足,只能通过错误信息在百度上搜索解决方案,但毫无效果。随后我想到可能是之前修改了配置文件,导致SSH服务出现问题。于是,我通过阿里云控制台使用救援连接,成功进入了SSH服务,并发现S…

    2026年9月22日
    200
  • python 基准测试(cProfile kcachegrind line_profiler memory_profiler)

    learn from 《python高性能(第2版)》 类似工具:pycharm profile对函数调用效率进行测试 1. 例子 一个圆周运动的动画 代码语言:javascript代码运行次数:0运行复制 from matplotlib import pyplot as pltfrom matpl…

    2026年9月22日
    200
  • VSCode安装C/C++开发环境 最新VSCode配置C语言教程详解

    答案:搭建VSCode的C/C++环境需安装编译器、C/C++扩展并配置项目文件。首先安装MinGW(Windows)、Clang(macOS)或GCC(Linux),配置环境变量并验证;然后在VSCode中安装Microsoft的C/C++扩展;最后创建.c_cpp_properties.json…

    2026年9月22日
    300
  • Linux平台下的Eclipse配置

    在linux平台上配置eclipse时,可能会遇到一些常见的问题和优化需求。本文将详细介绍如何解决这些问题,并提供优化eclipse的建议。 启动Eclipse报错 启动Eclipse时,如果遇到以下错误: A Java Runtime Environment (JRE) or Java Devel…

    2026年9月22日
    000
  • 常见分布式任务调度工具浅析

    一、背景 在日常业务中,经常会遇到需要在特定时间执行任务或周期性执行任务的需求。这些任务通常被归类为定时任务。为了满足这种需求,各种任务调度框架应运而生,如Timer、ScheduledThreadPoolExecutor(没错,它也可以用于定时任务)、Quartz等。然而,随着分布式和微服务的发展…

    2026年9月22日
    200
  • VSCode安全更新机制解析

    VSCode通过自动检查、数字签名验证和用户可控策略确保更新安全。启动时后台定期HTTPS请求检查新版本,每日一次;安装包经平台特定签名(Windows Authenticode、macOS代码签名、Linux GPG)验证完整性;用户可选自动更新、提示或关闭,企业可集中管控;微软通过安全入口响应漏…

    2026年9月22日
    200
  • Linux系统中文件属性和权限实战操作

    Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作

    —–原本今天的文章是昨天晚上就要更新的,但是由于昨天晚上下班回到住的地方,发现停电了,所以就没写成。今天是在上一篇文章–linux系统中文件类型的基础上,继续进行深入的学习。好了,直接开干。 一、文件的操作权限: 1、在这之前我想还是很有必要介绍对文件的操作权限(…

    2026年9月22日 用户投稿
    300
  • VSCode配置GDB调试器 深入掌握VSCode调试C程序技巧

    配置vscode中gdb调试c程序的核心是正确设置tasks.json和launch.json;2. tasks.json负责使用gcc -g编译生成带调试信息的可执行文件,确保prelaunchtask与launch.json中的program路径一致;3. launch.json指定调试器gdb…

    2026年9月22日
    100
  • 如何在Linux命令行中进行文件查找?

    最常用Linux查找文件方法是使用find命令。按名称搜索用-name选项,如find . -name “*.log”;忽略大小写用-iname;按类型查用-type f(文件)或d(目录);按大小查用-size,如+100M表示大于100MB;按修改时间用-mtime,-7…

    2026年9月22日
    000
  • VSCode配置C语言调试环境 从零开始VSCode搭建C开发工具

    要从零开始在#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8中搭建c语言开发和调试环境,首先需安装vscode本体、c/c++编译器(如mingw或gcc)并配置系统环境变量,接着安装vscode的c/c++扩展,然后创建项目并编写c…

    2026年9月22日
    100
  • 每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧

    每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧

    无论您是bash 初学者还是专家,如果不使用超级有用的 bash 历史记录功能,您将无法继续在命令行中工作。 您可能已经知道,如果您在 Linux 终端中使用向上或向下箭头键,您可以查看之前运行的命令。 这要归功于bash history 命令。 1.查看您的 bash 历史记录 查看您之前键入的命…

    2026年9月22日 用户投稿
    000
  • VSCode搭建Python开发环境(附详细截图,小白也能学会)

    答案:搭建VSCode Python环境需安装Python并添加至PATH,安装VSCode及Python扩展,创建项目文件并选择正确解释器,通过虚拟环境隔离依赖,利用Pylance、Black、Flake8等工具提升开发效率,常见问题多为路径或环境配置错误,可通过检查解释器选择和安装路径解决。 在…

    2026年9月22日
    100
  • Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析

    Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析

    号外号外!awesome-vit 上新啦, 欢迎大家 Star Star Star ~ https://github.com/open-mmlab/awesome-vit 前言 在 Vision Transformer 必读系列之图像分类综述(一):概述 一文中对 Vision Transforme…

    2026年9月22日 用户投稿
    300
  • 解决PHP应用中本地文件更新后网页视图不刷新的缓存问题

    本文探讨了PHP应用中,本地JSON或图片文件更新后,网页视图无法实时刷新的常见问题。核心原因在于浏览器缓存机制。文章将提供多种解决方案,包括强制刷新、隐身模式诊断、以及通过URL参数、服务器配置(.htaccess)和文件版本控制来有效管理缓存,确保用户始终获取最新数据。 理解问题:本地文件更新与…

    2026年9月22日
    200
  • VSCode安装C/C++代码格式化 专业VSCode开发环境配置

    配置VSCode进行C/C++开发需安装C/C++扩展包和clang-format,设置自动格式化与调试环境,推荐使用CMake Tools、Include Autocomplete等扩展,结合快捷键、代码片段和任务自动化提升效率。 配置VSCode以实现C/C++代码的专业格式化和高效开发环境,核…

    2026年9月22日
    500
  • Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)

    could not find doxygen (missing: doxygen_executable)  使用cmake .. 有时候会遇到如下问题: 代码语言:javascript代码运行次数:0运行复制 $ cmake ..– The CXX compiler identification …

    2026年9月22日
    100
  • MySQL自动化备份如何实现_适合企业级部署吗?

    MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?

    mysql的自动化备份对企业级部署是必要的,且可通过多种方式实现。1. 使用mysqldump+定时任务(crontab)是最基础的方式,操作简单适合中小规模数据库,但备份时可能锁表影响业务;2. 增量备份结合二进制日志(binary log)更高效,适用于频繁变更的数据,支持精确恢复到某时间点;3…

    2026年9月21日 用户投稿
    200
  • Online Config VS Code

    Online Config VS CodeOnline Config VS CodeOnline Config VS CodeOnline Config VS Code

    run vs view Install Code Server Update Code Server Database:It is recommended to create a Docker container for the database. Code Language: JavaScript…

    2026年9月21日 用户投稿
    200

发表回复

登录后才能评论
关注微信