0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用指针数据包定义数据缓冲区

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者:Vincent 2023-09-27 15:01 次阅读

指针数据包

相信大多数人会将定长数组换为 指针 , 每次使用时动态的开辟 CURR_LENGTH 大小的空间, 因为这样可以避免造成 MAX_LENGTH - CURR_LENGTH 空间的浪费, 只浪费了一个指针域的空间.

  • 数据包定义
struct point_buffer
{
    int     len;
    char    *data;
};
  • 数据结构大小

考虑对齐, 那么数据结构的大小 >= sizeof(int) + sizeof(char *)

  • 数据包创建

但是在开辟内存时, 需要调用两次malloc ,第一次给结构体分配内存,第二次给成员data分配内存:

if ((pbuffer = (struct point_buffer *)malloc(sizeof(struct point_buffer))) != NULL)
    {
        pbuffer- >len = CURR_LENGTH;
        if ((pbuffer- >data = (char *)malloc(sizeof(char) * CURR_LENGTH)) != NULL)
        {
            memcpy(pbuffer- >data, "Hello World", CURR_LENGTH);


            printf("%d, %sn", pbuffer- >len, pbuffer- >data);
        }
    }
  • 释放

释放也需要调用两次free函数 ,先释放数据域指针,再释放结构体指针:

/// 销毁
    free(pbuffer- >data);
    free(pbuffer);
    pbuffer = NULL;
  • 优点 :不会造成空间的大量浪费,只多使用了一个指针大小的空间
  • 缺点 :开辟空间时需要额外开辟数据域的空间,释放时也需要先释放数据域的空间。假如用户不知道这个数据包创建的具体细节,有可能会只释放结构体指针,不释放数据域指针。因此容易造成内存泄露。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128812
  • 指针
    +关注

    关注

    1

    文章

    473

    浏览量

    70364
  • 数据包
    +关注

    关注

    0

    文章

    231

    浏览量

    24095
收藏 人收藏

    评论

    相关推荐

    使用UART FIFO缓冲区时,缓冲区中的数据有时会损坏的原因?

    我在使用 UART FIFO 缓冲区时遇到了以下问题。 问题描述: 当通过两个 UART 通道使用完整的 UART FIFO 缓冲区并通过两个通道进行通信时,缓冲区中的数据有时会损坏,
    发表于 03-06 06:59

    缓冲区数据如何转换成数组

    各位高手,请问下我从仪器中读取出来数据缓冲区后,如何能把这些数据转换成一个数组,格式应该怎样去转换。。。。半天也弄不出来 帮帮忙吧先谢谢大家了。。。缓冲区
    发表于 02-22 17:05

    摄像头采集到的数据远远超过了发送缓冲区数据,可以不用缓冲区吗?

    做了一个摄像头的实验,用的是stm32f103,MCU把摄像头采集到的数据通过串口发送到PC。但我现在比较糊涂的是,摄像头采集到的数据远远超过了发送缓冲区数据,可以不用
    发表于 11-05 22:06

    STM32进阶之串口环形缓冲区实现

    两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(Head)是缓冲区可读的数据,指向列队尾的指针(Tail)是
    发表于 06-08 14:03

    杰杰带你解读【机智云】环形缓冲区源码

    = NULL; rb->rbCapacity = 0;return 0;}把这些指针指向NULL,但是环形缓冲区本身地址的数据是不会被清除的,只是表明了这些地址可以被重复使用了而已
    发表于 07-17 14:58

    MCU进阶之串口环形缓冲区实现

    测试数据没有发生丢现象。补充对于现在的阶段,杰杰我本人写代码也慢慢学会规范了。所有的代码片段均使用了可读性很强的,还有可移植性也很强的。我使用了宏定义来决定是否开启环形缓冲区的方式来
    发表于 08-17 13:11

    STM32串口环形缓冲区的实现

    一个数组,只不过有两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(Head)是缓冲区可读的数据,指向列队尾的指针(Tail)是
    发表于 10-16 11:40

    在fpga中缓冲和切换缓冲区大小应该是多少?

    嗨,我正在以一个频率连续地以随机顺序接收数据包,并且我想要以相同/不同的频率按顺序缓冲和输出它们。正常的FIFO不起作用,因为数据包不会是“先进先出”,缓冲区大小应该是多少?有什么线索
    发表于 02-28 09:46

    基于ARM和FPGA的环形缓冲区接口设计方案

    公司的V5系列SX95T型FPGA组成。物理层最高速率为1Mb/s,通过变化来自应用层的数据包大小和的间隔来改变用户速率,用以测试ARM和FPGA的数据缓冲区和匹配功能。实际测试和运行表明,此方案
    发表于 05-30 05:00

    如何检测数据包丢失?

    您好,我想做一个回环字体(发送一个IP地址和MAC地址反转的rx),具有最好的性能(这是对网络段进行速度测试)。我可以将rx缓冲区切换到tx缓冲区(以避免复制)吗?你能给我一个源代
    发表于 03-13 08:56

    如何用初始数据填充RAM缓冲区

    我想用初始数据填充RAM缓冲区,当数据请求信号到来时,数据将准备好并等待。我有一个状态机,当状态为1时,数据写入
    发表于 06-14 20:15

    环形缓冲区简介

    STM32串口数据接收 --环形缓冲区环形缓冲区简介  在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区
    发表于 08-17 06:56

    请问串口的DMA接收缓冲区是不是环形缓冲区

    大家好!请问串口的DMA接收缓冲区是不是环形缓冲区?通过阅读串口部分的代码,我了解到这样几点:1、串口的DMA接收时循环接收,当缓冲区满了会重新从头开始覆盖掉之前的数据,和环形
    发表于 08-30 14:27

    嗅探器的最佳缓冲区wifi设置是什么?

    我使用 esp32 作为 wifi 802.11 数据包嗅探器,使用混杂模式。该设备专用于此目的,因此我想要一个能够最大化嗅探器性能的 wifi 配置。嗅探器的最佳缓冲区设置是什么?
    发表于 03-01 06:53

    变长数据包数据结构定义

    用方便的呢? GNU C 的0长度数组(变长数组/柔性数组)就是这样一个扩展. 对于 0长数组 的这个特点,很容易构造出变成结构体,如缓冲区数据包等等: 数据结构定义 // 0长度数
    的头像 发表于 09-27 15:08 454次阅读