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

环形缓冲区的实现

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

2.9K40

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 也就是说,两个一次只走一步的指针,其中一个再表头走,另一个再相遇点走,都会在第一个结点相遇。...知道这一点就容易解决这道题了,只要先找到他们的相遇点然后再让两个指针从表头和相遇点一步一步的走就能相遇了,虽然圆环中的指针可能会循环多次。

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

    无锁环形缓冲区的详细解释

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

    1K30

    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.6K2219

    【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 数据 , 放入内存缓冲区中 ; 这是因为 读写内存的效率 远远高于

    89010

    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,就永远追不上。

    15510

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

    在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组的方式实现了一个先进先出的循环队列(circular queue),用以缓存内核驱动上报给用户层的...头指针head以input_event事件为单位,记录缓冲区的入口偏移量,而包指针packet_head则以“数据包”(一到多个input_event事件)为单位,记录缓冲区的入口偏移量。 ?...”操作,使内核运作更高效,input子系统的环形缓冲区采用了“求与”算法,这要求bufsize必须为2的幂,在后文中可以看到bufsize的值实际上是为64或者8的n倍,符合“求与”运算的要求。...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到达入口点,发生相遇。

    19820

    头歌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.5K11

    【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.3K20

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

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

    9910

    无头单向非循环链表(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*

    39300

    【编程基础】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
    领券