当前位置: 代码迷 >> 综合 >> 【庖丁解牛】C语言变长数组(柔性数组) struct中uint8_t data[0]的用法
  详细解决方案

【庖丁解牛】C语言变长数组(柔性数组) struct中uint8_t data[0]的用法

热度:51   发布时间:2024-01-20 09:05:34.0

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);
}
  相关解决方案