首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

环形缓冲区实现

环形队列实现:在计算机中,也是没有环形内存,只不过是我们将顺序内存处理过,让某一段内存形成环形,使他们首尾相连,简单来说,这其实就是一个数组,只不过有两个指针,一个指向列队,一个指向列队尾。...指向列队指针(Head)是缓冲区可读数据,指向列队尾指针(Tail)是缓冲区可写数据,通过移动这两个指针(Head) &(Tail)即可对缓冲区数据进行读写操作了,直到缓冲区已满(头尾相接)...当数据要进行处理时候,肯定是先处理‘0’空间数据,也就是列队数据,处理完了数据,‘0’地址空间数据进行释放掉,列队指向下一个可以处理数据地址‘1’。从而实现整个环形缓冲区数据读写。...从队列到串口缓冲区实现 串口环形缓冲区收发:在很多入门级教程中,我们知道串口收发都是:接收一个数据,触发中断,然后把数据发回来。...写入环形缓冲区代码实现: 1/** 2* @brief Write_RingBuff 3* @param u8 data 4* @return FLASE:环形缓冲区已满,写入失败;TRUE

2.8K40

LeetCode 环形链表 II(C语言)

题目要求 给定一个链表节点 head ,返回链表开始入环第一个节点。 如果链表无环,则返回 null 。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。...假设未进入圆环之前长度为L,圆环长度为C,在圆环中相遇点与我们要找第一个结点相距长度为X。...p2走距离=2p1走距离 我们再假设p1进入圆环之前p2再圆环中走了N圈(N>=1) p1走距离:L+X p2走距离;L+NC+X 2(L+X)=L+NC+X L+X=NC L=NC-X...L=(N-1)*C+C-X 也就是说,两个一次只走一步指针,其中一个再表头走,另一个再相遇点走,都会在第一个结点相遇。...知道这一点就容易解决这道题了,只要先找到他们相遇点然后再让两个指针从表头和相遇点一步一步走就能相遇了,虽然圆环中指针可能会循环多次。

29600
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    无锁环形缓冲区详细解释

    后面有一篇博客还介绍了VxWorks下环形缓冲区实现机制点击打开链接,从而可以看出linux下fifo灵巧性和高效性。...kfifo是一种”First In First Out “数据结构,它采用了前面提到环形缓冲区来实现,提供一个无边界字节流服务。...采用环形缓冲区好处为,当一个数据元素被用掉后,其余数据元素不需要移动其存储位置,从而减少拷贝提高效率。...size 缓冲区空间大小,在初化时,将它向上圆整成2幂 in 指向buffer中队 out 指向buffer中队尾 lock 如果使用不能保证任何时间最多只有一个读线程和写线程...它结构如图: 这看起来与普通环形缓冲区没有什么差别,但是让人叹为观止地方就是它巧妙用 in 和 out 关系和特性,处理各种操作,下面我们来详细分析。

    93430

    C语言缓冲区溢出详解

    wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1] 1 引言 “缓冲区溢出”对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格 C/C++ 程序员...简单说,缓冲区就是一块连续计算机内存区域,它可以保存相同数据类型多个实例,如字符数组。而缓冲区溢出则是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身容量,溢出数据覆盖在合法数据上。...2 C/C++中内存分配 任何一个源程序通常都包括静态代码段(或者称为文本段)和静态数据段,为了运行程序,操作系统首先负责为其创建进程,并在进程虚拟地址空间中为其代码段和数据段建立映射。...当程序写入超过缓冲区边界时,就会产生所谓缓冲区溢出”。...','5','6','7','8',’\0’}; //或者 char array[11]={'0','1','2','3','4','5','6','7','8','9’}; 更多案例可以go公众号:C语言入门到精通

    2.5K2219

    C语言】getchar()函数缓冲区

    目录 前言 gethcar()函数介绍 缓冲区 结束语 ---- ---- ✨专栏:《C语言从0到1》 ✨送给各位一句话:种一棵树最好时间是十年前,其次是现在 ✨说明:无论如何,当我们下定决心时候...---- 前言 大家好啊,由于之前有关C语言博客写比较少,不够详细,加之较少时间写博客,但是我会尽己所能,把每一篇博客写好,帮助自己复习同时,我也希望能够帮助到大家,让我们一起努力学习吧。...接下去,我会陆续更新并且完善关于专栏《C语言从0到1》这个系列,如果大家有需要,一起学习,记得点赞关注加收藏哦!...当输入缓冲区什么都没有的时候,getchar()此时就会等待:如一开始运行后光标一直在闪。当我们输入a时候,我们需要回车,相当于给缓冲区输入一个a和\n。当getchar()读取时候读取到a,a!...这时候如果缓冲区有很多字符时候,我们该怎么办?循环解决呗 图片 图片 这时候就顺利解决完上面存在问题了!

    1.2K30

    C 语言】文件操作 ( C 语言文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )

    文章目录 一、C 语言文件操作函数 二、磁盘与内存缓冲区 三、缓冲区工作机制 一、C 语言文件操作函数 ---- 读取 文本文件 可以使用 getc , fgets , fscanf 函数 ,...---- 上述所有读写文件函数 , 都是缓冲区函数 , 即 C 语言文件操作 , 都是缓冲区函数 ; 磁盘 是由 操作系统 进行读写 , 用户写程序 , 不能直接操作磁盘 ; 操作系统 提供...读写文件 系统调用 接口 , 在该接口上 是 C 语言库函数 , 最上层就是 用户程序 ; 如果要操作硬件磁盘 , 就需要知道磁盘驱动程序 , 磁盘扇区操作等 , 这就比较复杂了 ; C 语言库函数...中 , 维护了一个缓冲区 , 这个缓冲区是 内存 中缓冲区 ; 使用 C 语言文件操作函数 读写 数据 , 不是直接来自磁盘 , 而是来自 内存中缓冲区 ; 三、缓冲区工作机制 ---- 缓冲区工作机制...: 如果 缓冲区大小 64KB , 假如使用 C 语言库函数 fread 读取一个字节数据 , 实际上会从磁盘文件中读取 64KB 数据 , 放入内存缓冲区中 ; 这是因为 读写内存效率 远远高于

    86510

    C语言入坑指南-缓冲区溢出

    前言 缓冲区溢出通常指的是向缓冲区写入了超过缓冲区所能保存最大数据量数据。...如果说之前所提到一些问题可能只是影响部分功能实现,那么缓冲区溢出将可能会造成程序运行终止,被不安全代码攻击等严重问题,因此我们不得不特别重视。...实际上,有时候缓冲区溢出导致程序马上运行出错是幸运,因为我们至少能够知道这里出错了。...同样,库函数中还有一些函数也可能造成缓冲区溢出,我们应该尽量避免使用它们,而选择使用更加安全版本。...总结 缓冲区溢出造成危害非常大,可能导致程序运行终止或程序运行异常且难以定位问题。当然有时候,也能够正常运行,但我们不能够抱有侥幸心理。因此在实际编程中,尽量选择那些更加安全函数来避免缓冲区溢出。

    1.7K30

    LeetCode刷题(3)【链表】【环形链表】&扩展(C语言)

    ---- ---- 环形链表 141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com) 什么是链表带环:链表最后一个元素不指向空而指向前面的某个结点。...若slow和fast已经进入环中,追逐已经开始了,假设他们之间距离是N,slow走1步,fast走2步,二者距离每次缩减1,N,N-1,N-2,…0,直到相遇。...如果N是偶数最后会减到0,如果N是偶数则减到-1,距离为0代表相遇,距离为-1代表反超了,进入新追逐,他们之间距离是 C-1(假设C 是环长度),如果C-1是偶数,就可以追上,如果C-1是奇数,就永远追不上...,因为是奇数时候又像开始那样反超,距离又是C-1,就永远追不上。

    15110

    input子系统事件处理层(evdev)环形缓冲区【转】

    在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组方式实现了一个先进先出循环队列(circular queue),用以缓存内核驱动上报给用户层...指针head以input_event事件为单位,记录缓冲区入口偏移量,而包指针packet_head则以“数据包”(一到多个input_event事件)为单位,记录缓冲区入口偏移量。 ?...”操作,使内核运作更高效,input子系统环形缓冲区采用了“求与”算法,这要求bufsize必须为2幂,在后文中可以看到bufsize值实际上是为64或者8n倍,符合“求与”运算要求。...input_event()函数写入环形缓冲区,用户程序通过read()函数从环形缓冲区中获取input_event事件。...环形缓冲区生产者 内核驱动作为生产者,通过input_event()上报input_event事件时,最终调用___pass_event()函数将事件写入环形缓冲区: static void __pass_event

    1.4K60

    LeetCode刷题(5)【链表】【环形链表II】(C语言)

    ---- 环形链表I LeetCode刷题(3)【链表】【环形链表】&扩展_半生瓜のblog-CSDN博客 ---- 环形链表II 142....环形链表 II - 力扣(LeetCode) (leetcode-cn.com) 这个题写起来不难,但是证明有点麻烦。 ---- 针对这个入口点怎么求,有人给出了一个结论。...fast走路程: L + C*N + X slow走路程:L + X fast = 2*slow L + C*N + X = 2 (L + X) 化简一下得: C* N - X = L 再化简一下得...: ( N - 1 )* C + C - X = L C - X就是meet点到入口点距离。...结论:一个指针从meet点开始走,一个指针从链表开始点走,它们会在入口点相遇。 理解一下,就是一个指针从meet点出发,转转转了N-1圈,在走了一个C-X到达入口点,发生相遇。

    19620

    c语言实训作业题解

    c语言实训作业题解 持续更新 C语言程序设计编辑与调试环境 1.打印输出 Hello World 2.打印输出图形 3.求三个数最大值 4.熟悉C语言调试环境 C语言中最基本输入输出 1.看看你成绩怎么样...+……值 循环结构程序设计2 第1关:C循环-求平均成绩 第2关:C循环-求各位数字之积 第3关:C循环-求阶乘之和 第4关:C循环-水仙花数 第5关:C循环-寻找完数 第6关:分数求和 算法竞赛入门经典...第4关:矩阵转置 第5关:字符串排序 C语言程序设计编辑与调试环境 1.打印输出 Hello World 本关任务:通过运行一个C语言程序,让你初步了解程序运行方法。...return 0; } 4.熟悉C语言调试环境 本关任务:以下程序源代码有错误,请使用C语言调试功能,检查程序错误并更正,使之能正确运行。...("*****"); else printf("#####"); return 0; /********* End *********/ } C语言中最基本输入输出

    5.3K10

    C 语言】文件操作 ( fflush 函数 | 刷新缓冲区示例代码 )

    文章目录 一、fflush 函数 二、内存缓冲区示例 三、使用 fflush 函数刷新内存缓冲区示例 一、fflush 函数 ---- 缓冲区内容写入磁盘时机 : 缓冲区满了 调用 fclose 关闭文件函数...如果想要立刻写入磁盘 , 可以使用 fflush 函数刷新缓冲区 , 将缓冲区数据 , 写入磁盘中 ; fflush 函数原型 : 将缓冲区中未写入磁盘中数据写入磁盘中文件中 ; #include... int fflush(FILE *stream) fflush 函数可以实时将缓冲区数据写入磁盘中 , 强烈不推荐频繁大量调用该函数 , 读写磁盘速度很慢 , 浪费性能 , 浪费时间...影响磁盘寿命 二、内存缓冲区示例 ---- 示例代码 : #include int main() { // 以写文本方式向文件中写出数据 FILE *p = fopen...// 关闭文件 fclose(p); return 0; } 执行结果 : 输入 " exit " , 退出循环 , 调用 fclose 函数关闭文件 , 此时才将内存缓冲区数据

    3.1K20

    C语言】文件操作(2)(文件缓冲区和随机读取函数)

    ,在上一篇文章中我们就学过了文件读取函数,这里我们就不再多赘述,如果忘记可以翻看上一篇文章:【C语言】文件操作(1)(文件打开关闭和顺序读写函数万字笔记) 判断函数fgetc返回值是否为EOF 判断函数...这时我们就要引入文件缓冲区概念了,ANSIC 标准采⽤“缓冲⽂件系统” 处理数据⽂件,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤⽂件开辟⼀块“⽂件缓冲区”    从内存向磁盘输出数据会先送到内存中缓冲区...,装满缓冲区后才⼀起送到磁盘上。...如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区,充满缓冲区后再从缓冲区逐个地将数据送到程序数据区(程序变量等)    在文件中,有多种情况可以刷新缓冲区,将缓冲区数据写入文件,我们这里就讲一下常用三种情况...当缓冲区被装满后自动刷新缓冲区,将数据写入文件 当文件被关闭时,也会刷新缓冲区,将数据写入文件 使用fflush函数刷新缓冲区,它可以几乎不受限制随时刷新缓冲区,使得缓冲区数据写入文件    那么缓冲区具体有多大呢

    8210

    单向非循环链表(C语言实现)

    单链表 设计思路 实现增删查改准备工作 插尾插 删尾删 查找与销毁 在pos之后插入数据为x结点与删除pos后面的结点 完整代码 设计思路 链表是一种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表...实现增删查改准备工作 分两个源文件,一个头文件: linked.h linked.c test.c 结点类型定义 //linked.h typedef int type;//重新定义数据类型名字...//test.c ct* head = NULL;//结点指针 默认指向为空,如果没有数据就为空 开辟结点空间 //linked.c ct* crunode(type x)//动态创建一个结点...} 打印链表函数 这里不能断言是否为空指针,因为没有数据时候节点指向地方就是空指针,所以空指针我们也要打印(因为更形象,实际上并不需要打印NULL) //linked.c void SListPrint...= cur->next; } printf("NULL\n");//打印末尾NULL } 插尾插 下面这些函数都是在linked.c文件中 尾插 void SListPushBack(ct*

    39000

    C 语言】字符串模型 ( 两堵模型 )

    文章目录 一、两堵模型 二、完整代码示例 一、两堵模型 ---- 两堵模型 是 有 2 个指针 , 一个指向字符串头部 , 一个指向字符串尾部 ; 头部指针 从左向右 开始遍历 ; 尾部指针..., j 指向尾部 int i = 0, j = strlen(str) - 1; 左侧指针从左向右遍历 : // 循环条件是 i 指针指向 位置 为空 则继续循环 // 遇到第一个不为空字符...= '\0') { i++; } 右侧指针从右向左遍历 : // 循环条件是 j 指针指向 位置 为空 则继续循环 // 遇到第一个不为空字符 ,...位置 为空 则继续循环 // 遇到第一个不为空字符 , 便停止循环 // 停止循环时 i 指向从左侧开始第一个不为空字符 while(isspace(str[i]) &&...停止循环时 j 指向从右侧开始第一个不为空字符 while(isspace(str[j]) && str[j] !

    78710

    【编程基础】C语言FILE结构体以及缓冲区深入探讨

    C语言中,用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指文件进行各种操作。...不同编译器 stdio.h 头文件中对 FILE 定义略有差异,这里以标准C举例说明: #define NULL 0 #define EOF (-1) #define BUFSIZ 1024 #define...如果我们通过setbuf()或setvbuf()函数将缓冲区设置10个字节大小,而我们从键盘输入了20个字节大小数据,这样我们输入前10个数据会放在缓冲区中,因为我们设置缓冲区大小只能够装下10...base // 缓冲区基地址 在上面我们向缓冲区中放入了10个字节大小数据,FILE结构体中 cnt 变为了10 ,说明此时缓冲区中有10个字节大小数据可以读,同时我们假设缓冲区基地址也就是...缓冲区刷新就是将指针 ptr 变为缓冲区基地址 ,同时 cnt 值变为0 ,因为缓冲区刷新后里面是没有数据! 转自C语言中文网

    2.9K70
    领券