c c++ 函数内数组初值_C:弹性数组——flexible array

96047e9b23c8b387e82b886808a19134.png

一. 定义

定义数组时,没有指明其长度,此为弹性数组。

二. 使用条件

弹性数组只能存在于结构体中,并且必须满足如下条件:

  1. 弹性数组必须为结构体的最后一个成员
  2. 该结构体必须包含一个非弹性数组的成员;
  3. 编译器需要支持 C99 标准

三. 示例

声明一个学生信息结构体,其中包含学号,年级,学生姓名。

 typedef struct {
     int32_t id;
     int32_t grade;
     int8_t  name[];
 }struct_info_struct;

其中的 int8_t name[] 即为弹性数组。因为学生的姓名有长有短。如果定义为固定长度,会造成空间浪费。

四. 使用方法

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h>
 ​
 typedef struct {
     int32_t id;
     int32_t grade;
     int8_t name[];
 }student_info_struct;
 ​
 int main() {
     int32_t *tmp = 0;
     int8_t *name = "sdc";
     student_info_struct *si = NULL;
 ​
     printf("sizeof(struct) = %dn", sizeof(student_info_struct));
 ​
     si = (student_info_struct *)malloc(sizeof(student_info_struct) + strlen(name) + 1); // +1 是为了存储 '0'
     if(NULL == si)
     {
         printf("malloc failedn");
         return -1;
     }
     memset((void *)si, 0, sizeof(student_info_struct) + strlen(name) + 1);
 ​
     si->id = 123;
     si->grade = 6;
     memcpy((void *)si->name, name, strlen(name));
 ​
     printf("addr:n");
     printf("si: 0x%pn", si);
     printf("si->grade: 0x%pn", &si->grade);
     printf("si->name: 0x%pn", &si->name);
     printf("si->name: 0x%pn", si->name);
 ​
     return 0;
 }

结果:

 sizeof(struct) = 8
 addr:
 &si: 0x00000000003C21C0
 &si->grade: 0x00000000003C21C4
 &si->name: 0x00000000003C21C8
 si->name: 0x00000000003C21C8

说明:

  1. 通过 sizeof(struct) = 8 可以看出,弹性数组在结构体中不占用空间。所以 &si->namesi->name 的值相同;
  2. 代码第 19 行的 malloc 申请了 sizeof(student_info_struct) + strlen(name) + 1 大小的空间。其中 strlen(name) + 1 是为 si->name 分配的;
  3. 结构体 si 在内存中的数据:

979e6cc687c677045b3e8ae00b6c95d2.png

五. 用途

弹性数组主要用于存储不定长数据,比如上例中的学生姓名。 我用弹性数组来存储串口数据,比如接收北斗或 GPS 模块数据。这两者的数据都不是定长的,每次收到相应的帧以后,根据帧中的『长度』字段来分配空间。

六. 参考

以下链接中给出了弹性数组的其他实现方式,用于不支持弹性数组的编译器中。

https://riptutorial.com/c/example/10850/flexible-array-members

https://www.geeksforgeeks.org/flexible-array-members-structure-c/

http://c-faq.com/struct/structhack.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值