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

    文章

    7596

    浏览量

    136017
  • 指针
    +关注

    关注

    1

    文章

    478

    浏览量

    70497
  • 数据包
    +关注

    关注

    0

    文章

    250

    浏览量

    24353
收藏 人收藏

    评论

    相关推荐

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

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

    ESP8266有双缓冲区吗?

    我想实时传输一些信号的测量数据。信号的采样周期为 1 ms。我想每 500 毫秒发送 2048 字节(一个数据包)。ESP8266有双缓冲区(2x 2048字节)吗?其想法是计数填充一个缓冲区
    发表于 07-16 07:29

    STM32串口环形缓冲区的实现

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

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

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

    如何检测数据包丢失?

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

    一文读懂路由器缓冲区大小的重要性

    对于网络而言,数据包在网线上的时候,绝对安全,绝对是全速前进,最危险的就是到达转发设备内部,设备处理数据包带来的固有延迟导致数据包必须有机会被缓冲,处理加速比一定要和
    发表于 10-15 09:47 4581次阅读

    CPU与GPU维护数据结构来保证环形缓冲区的正确工作

    CPU 和 GPU 将各自维护一些数据结构来保证环形缓冲区的正确工作。这些 数据结构有缓冲区的基地址,缓冲区大小,写
    的头像 发表于 03-30 15:01 6416次阅读
    CPU与GPU维护<b class='flag-5'>数据</b>结构来保证环形<b class='flag-5'>缓冲区</b>的正确工作

    环形缓冲区的实现原理

    在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对
    的头像 发表于 03-22 10:03 7485次阅读
    环形<b class='flag-5'>缓冲区</b>的实现原理

    缓冲区是啥意思 STM32串口数据接收之环形缓冲区

    缓冲区顾名思义是缓冲数据用的。实现缓冲区最简单的办法时,定义多个数组,接收一
    的头像 发表于 07-22 15:33 1.1w次阅读

    STM32串口数据接收 --环形缓冲区

    STM32串口数据接收 --环形缓冲区环形缓冲区简介  在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区
    发表于 12-28 19:24 30次下载
    STM32串口<b class='flag-5'>数据</b>接收 --环形<b class='flag-5'>缓冲区</b>

    数据包的发送流程

    一个数据包,从聊天框里发出,消息会从聊天软件所在的用户空间拷贝到内核空间的发送缓冲区(send buffer),数据包就这样顺着传输层、网络层,进入到数据链路层,在这里
    的头像 发表于 08-19 14:38 2593次阅读

    零长数组如何使用定长定义数据缓冲区

    零长数组 请先思考以下问题: C语言中,数组长度是否可以为0? 如果要接收一个不定长数据包,你会如何定义数据缓冲区? 第一个问题 : 在标准C语言中,没有长度为0的数组,但在 GNU
    的头像 发表于 09-27 14:58 640次阅读

    变长数据包数据结构定义

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

    C++环形缓冲区设计与实现

    一、环形缓冲区基础理论解析(Basic Theory of Circular Buffer) 1.1 环形缓冲区定义与作用(Definition and Function of Circular
    的头像 发表于 11-09 11:21 1816次阅读
    C++环形<b class='flag-5'>缓冲区</b>设计与实现

    交换机与路由器缓冲区:寻找完美大小

    学术界和工业界一直备受争议。本文探讨了高端路由器中数据包缓冲的历史和演变,以期概述当前的实践和未来的趋势。 网络芯片中的缓冲区 在典型的路由器/交换机 ASIC 中,会发现三种类型的数据包
    的头像 发表于 04-11 16:56 1030次阅读
    交换机与路由器<b class='flag-5'>缓冲区</b>:寻找完美大小