C语言变长数组(柔性数组) struct中uint8_t data[0]的用法
零长度数组介绍
typedef struct {
cp_head_t header;uint8_t data[0];
}__attribute__((packed)) cp_frame_t;
首先对 0长度数组
, 也叫柔性数组 :
-
用途 : 长度为0的数组的主要用途是为了满足需要变长度的结构体
-
用法 : 在一个结构体的最后, 申明一个长度为0的数组, 就可以使得这个结构体是可变长的. 对于编译器来说, 此时长度为0的数组并不占用空间, 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量
-
优点 :比起在结构体中声明一个指针变量、再进行动态分 配的办法,这种方法效率要高。因为在访问数组内容时,不需要间接访问,避免了两次访存。
-
缺点 :在结构体中,数组为0的数组必须在最后声明,使 用上有一定限制。
举例用法
static bool gdb_station_state_read(cp_frame_t * info)
{
gdb_net_status_t body;body.station_type = 0; /* 有线采集站 */body.connect_state = 0; /* 网络没有连接 */rz_get_station_state(&body.station_type, &body.connect_state);uint8_t tx_buf[64] = {
0};cp_frame_t *send = (cp_frame_t *)tx_buf;send->header.head = 0x5542;send->header.cmd = info->header.cmd;send->header.len = sizeof(body) + sizeof(cp_frame_t) + sizeof(cp_tail_t);/* 填充数据段内容与业务相关 */send->data[0] = body.station_type;send->data[1] = body.connect_state;tx_buf[send->header.len-1] = compute_cs(tx_buf, send->header.len);return uart_send_with_recv(SERIAL_RS232_S3, tx_buf, send->header.len, NULL, NULL, 2000);
}