c语言 关于0长度数组的使用

  • 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]只是方便操作。

你可能感兴趣的:(c语言 关于0长度数组的使用)