全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 可编程逻辑 >

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

时间:2023-09-27 14:58

人气:

作者:admin

标签:

导读:零长数组 请先思考以下问题: C语言中,数组长度是否可以为0? 如果要接收一个不定长数据包,你会如何定义数据缓冲区? 第一个问题 : 在标准C语言中,没有长度为0的数组,但在...

零长数组

请先思考以下问题:

  • 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 长度的数据很少, 那么多数情况下, 缓冲区的大部分空间都是浪费掉的.
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信