c语言 关于0长度数组的使用
2021-06-10 本文已影响0人
eversay
- 0长度数组可用于通讯中做不定长数据包结构体的设计
typedef struct
{
uint8_t head;//固定字符
uint8_t cmd;//命令
uint8_t args;//参数
uint8_t size[2];//data数据大小
uint8_t data[0];
//uint8_t crc[2]; //补在data后两个字节
} pack_t,*ppack_t;
//定义一个数据包的结构体指针
pack_t *pack;
- 思路
这是一个简单的通讯包的结构体的设计,head 为固定字符,用于快速判断通讯数据协议是否是满足要求的,cmd 和 args 做协议数据类型识别,size 是这个包中data 数据的长度,data[0] 是一个0长度的数组,实际上在计算这个结构体大小的时候 data 这个字段是没有算进去的,所以这个结构的大小应该是5个字节的大小,0长度数组的使用方式是 将一组有n个字节大小的数组的起始地址指针array,强制转换为上面这个结构体指针,从而得到的((*pack_t)array)->data 这个地址就是通讯数据包中待使用的有效数据data的起始地址。这个有效数据data在内存上是紧跟在size这个字段后面的,使用data[0]只是方便操作。