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

零长数组请先思考以下问题:
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 长度的数据很少, 那么多数情况下, 缓冲区的大部分空间都是浪费掉的.

Vivo X60 Pro+详细参数公布
空气绝缘开关柜体积大吗?
NFC技术多点开花,引领全新移动生活
「应用篇」北斗助力车联网系统升级
区块链为制造业能产生什么样的价值
零长数组如何使用定长包定义数据缓冲区
一加5T和iPhoneX性能大PK,一加5T完败iPhoneX
苹果CEO库克发文缅怀乔布斯 然后库克获8亿元年终奖
忆阻器基础研究测试
iPhone8什么时候上市?iPhone8最新消息:iPhone8机型正式确定,iPhone8屏幕支架照片曝光辨别真伪
超声波清洗机是真的能清洗干净吗?
30w太阳能路灯设计方案汇总(六款太阳能路灯原理图详解)
全球首款2nm芯片在哪里
PCB多层板 pcb多层板结构介绍
卧龙电气与美国通用电气签署并完成SIM的收购和交割
SEI结构随阳极特性变化的演变
realme中国市场将全面切入5G产品,将在2020年推出电视品类
国芯思辰|兼容AD9361,地芯科技宽带收发机GC0801助力4G微基站射频电路方案设计
浅谈Spartan6的5种配置模式
全球首颗双向PD3.1认证SOC电源芯片——水芯电子M12269