C语言0长度数组(可变数组/柔性数组)
作者:互联网
一、零长度数组概念
众所周知, GNU/GCC
在标准的 C/C++
基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero
) 就是其中一个知名的扩展,多数情况下, 其应用在变长数组中, 其定义如下
struct Packet { int state; int len; char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持 };
首先对 0长度数组, 也叫柔性数组 做一个解释 :
(1)用途 : 长度为0的数组的主要用途是为了满足需要变长度的结构体
(2)用法 : 在一个结构体的最后, 申明一个长度为0的数组, 就可以使得这个结构体是可变长的. 对于编译器来说, 此时长度为0的数组并不占用空间, 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量.
二、 0长度数组的用途
我们设想这样一个场景, 我们在网络通信过程中使用的数据缓冲区, 缓冲区包括一个len字段和data字段, 分别标识数据的长度和传输的数据, 我们常见的有几种设计思路。
-
定长数据缓冲区, 设置一个足够大小
MAX_LENGTH
的数据缓冲区设置一个指向实际数据的指针, 每次使用时, 按照数据的长度动态的开辟数据缓冲区的空间.
-
设置一个指向实际数据的指针, 每次使用时, 按照数据的长度动态的开辟数据缓冲区的空间.
我们从实际场景中应用的设计来考虑他们的优劣. 主要考虑的有, 缓冲区空间的开辟, 释放和访问。
1 定长包(开辟空间, 释放, 访问)
比如我要发送 1024
字节的数据, 如果用定长包, 假设定长包的长度 MAX_LENGTH
为 2048
, 就会浪费 1024
个字节的空间, 也会造成不必要的流量浪费.
(1)数据结构定义
// 定长缓冲区 struct max_buffer { int len; char data[MAX_LENGTH]; };
(2)数据结构大小
考虑对齐, 那么数据结构的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH
标签:MAX,C语言,LENGTH,数组,长度,缓冲区,柔性,数据 来源: https://www.cnblogs.com/zwj-199306231519/p/15334605.html