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

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

3天内不再提示

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

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

零长数组

请先思考以下问题:

  • C语言中,数组长度是否可以为0?
  • 如果要接收一个不定长数据包,你会如何定义数据缓冲区?

第一个问题

在标准C语言中,没有长度为0的数组,但在 GNU C语言中,数组长度可以为0 ,这是GNU对C语言的扩展。

先对零长数组做个介绍:

零长数组 :也叫柔性数组(变长数组)

  • 用途 : 长度为0的数组的主要用途是为了满足需要变长度的结构体
  • 用法 : 在一个结构体的最后, 申明一个长度为0的数组, 就可以使得这个 结构体是可变长的

对于编译器来说, 此时 长度为0的数组并不占用空间 , 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的 地址常量

第二个问题

通常定义一个不定长数据包的缓冲区,有两种常用方法:

  • 定长数据缓冲区 , 设置一个足够大小 MAX_LENGTH 的数据缓冲区
  • 设置一个指向实际数据的指针 , 每次使用时, 按照数据的长度动态的开辟数据缓冲区的空间

下面依次分析使用 定长包指针数据包和使用零长数组三种方式的不同。

定长包

假设我们要在网络中接收一个长度为1024字节的数据,怎么定义数据缓冲区呢?

定义一个数据缓冲区结构体data_buf,成员包含数据长度len和数据内容data

  • 数据结构定义
struct data_buf{
 int len;
 char data[MAX_LENGTH];
}
  • 数据结构大小

数据内容放在data数组中,数据最大长度限制为MAX_LENGTH字节,以满足接收数据的需求。

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

但是,通常情况下,我们接收的数据不会达到最大长度,假设MAX_LENGTH=2048,那么接收1024字节内容,还有1024字节空间就浪费了。

  • 数据包创建

当接收到数据时,使用malloc动态分配内存。一般来说, 我们会返回一个指向缓冲区数据结构 data_buf 的指针:

///  开辟
    if ((mbuffer = (struct data_buf *)malloc(sizeof(struct data_buf))) != NULL)
    {
        mbuffer- >len = CURR_LENGTH;//CURR_LENGTH为接收到的数据长度
        memcpy(mbuffer- >data, "Hello World", CURR_LENGTH);


        printf("%d, %sn", mbuffer- >len, mbuffer- >data);
    }
  • 释放
/// 销毁
free(mbuffer);
mbuffer = NULL;
  • 优点 :使用简单,内存的开辟和释放简单
  • 缺点 :使用定长数组作为数据缓冲区, 为了避免造成缓冲区溢出, 数组的大小一般设为足够的空间 MAX_LENGTH, 而实际使用过程中, 达到 MAX_LENGTH 长度的数据很少, 那么多数情况下, 缓冲区的大部分空间都是浪费掉的.
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6515

    浏览量

    87619
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    129012
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39908
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25597
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    abview中VISA的读、写缓冲区是同一个缓冲区吗?

    labview中VISA的读、写缓冲区是同一个缓冲区吗?通过读缓冲区字节数,只能读出读数据的大小,而不能知道写进去数据的大小。
    发表于 10-27 13:08

    缓冲区的解释

    就返回空数组。所以,总结一下,为了保证数据不会失丢,要设置好内存缓冲区的大小,还要保证读取缓冲区的程序(DAQmx Read.vi)循环得尽量快,每一次读取的
    发表于 04-07 15:56

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

    慢慢学会规范了。所有的代码片段均使用了可读性很强的,还有可移植性也很强的。我使用了宏定义来决定是否开启环形缓冲区的方式来收发数据,移植到大家的代码并不会有其他副作用,只需要开启宏定义
    发表于 06-08 14:03

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

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

    STM32串口环形缓冲区的实现

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

    UART缓冲区问题

    问题与中断有关。只要UARTHI PUCHCHAR例程将字符直接放入PSoC UART发送数据寄存器,就发送字符。如果UARTHIPPUCHAR例程将字符放置到缓冲区中,则缓冲区继续填充,并且没有一个字
    发表于 05-22 13:19

    环形缓冲区简介

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

    请问串口DMA+环形缓冲区如何实现不定长度的数据收发?

    请问串口DMA+环形缓冲区如何实现不定长度的数据收发?
    发表于 12-08 06:13

    怎样去使用STM32串口驱动不定长数据接收带环形缓冲区

    怎样去使用STM32串口驱动不定长数据接收带环形缓冲区呢?有哪些注意事项?
    发表于 12-08 08:08

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

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

    rtt的环形缓冲区读完就丢弃了?

    ;rtt的环形缓冲区读完就丢弃了,而且是不能读取任意的位置,现在想到的方法就是: 搞一个数组缓冲区,不断增加数据,记住缓冲区头和尾部对应的
    发表于 04-17 14:39

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

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

    日常编程中柔性数组定义和应用

      1 引言 定长数组包 在平时的开发中,缓冲区数据收发时,如果采用缓冲区定长包,假定大小是 1
    的头像 发表于 11-11 14:51 1181次阅读