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

    文章

    6926

    浏览量

    88867
  • C语言
    +关注

    关注

    180

    文章

    7602

    浏览量

    136357
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40105
  • 数组
    +关注

    关注

    1

    文章

    416

    浏览量

    25921
收藏 人收藏

    评论

    相关推荐

    嵌入式中零长度数组基本操作方法

    C语言零长度数组,听起来可能有点奇怪,因为它没有分配内存空间,无法存储数据。但实际上,零长度数组在Linux内核中随处可见。 零长度数组定义
    的头像 发表于 05-11 08:49 879次阅读
    嵌入式中<b class='flag-5'>零长度数组</b>基本操作方法

    在AN65974中短数据包零长数据包是什么意思?

    在 AN65974 中,短数据包零长数据包是什么意思? 非常感谢!
    发表于 05-30 07:41

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

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

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

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

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

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

    环形缓冲区的实现原理

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

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

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

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

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

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

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

    环形缓冲区的实现思路

    单片机程序开发一般都会用到UART串口通信,通过通信来实现上位机和单片机程序的数据交互。通信中为了实现正常的收发,一般都会有对应的发送和接收缓存来暂存通信数据。这里使用环形缓冲区的方式来设计
    的头像 发表于 01-17 15:07 1599次阅读

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

    指针数据包 相信大多数人会将定长数组换为 指针 , 每次使用时动态的开辟 CURR_LENGTH 大小的空间, 因为这样可以避免造成 MAX_LENGTH - CURR_LENGTH 空间的浪费
    的头像 发表于 09-27 15:01 468次阅读

    变长数据包数据结构定义

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

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

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

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

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

    单片机中的几种环形缓冲区的分析和实现

    单片机中的几种环形缓冲区的分析和实现一、简介环形缓冲区(RingBuffer)是一种高效的使用内存的方法,它将一段固定长度的内存看成一个环形结构,用于存储数据,能够避免使用动态申请内存
    的头像 发表于 08-14 08:39 735次阅读
    单片机中的几种环形<b class='flag-5'>缓冲区</b>的分析和实现