C语言struct中 Flexible array member

Flexible array member 简单应用

//redis-6.0.5/src/sds.h
struct __attribute__ ((__packed__)) sdshdr8 {
     
    uint8_t len; /* used */
    uint8_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

上面代码为redis-6.0.5源码中的sds.h文件中部分代码
此结构体中的最后一个成员char buf [] 就是一个示例,在C99中有介绍(section§6.7.2.1, item 16, page 103)
C语言struct中 Flexible array member_第1张图片
可伸缩数组的一些用法规则:

  • buf [] 不占用结构体存储空间,sizeof(strcut sdshdr8)为3
  • 结构体变量相邻的连续存储空间是char buf[]的内容,或者说它给定了char buf[]在sdshdr8 结构体中偏移位置
  • 伸缩数据必须是结构体的最后一个成员
  • 结构体至少还有一个其他成员,不能只有char buf[]
  • 声明格式 char name [] 方括号没有内容

这里只是简单介绍,看redis的源码中遇到的一个奇怪的东西,深度理解可以去找到C99标准研读。

你可能感兴趣的:(C,redis,源码,c语言,redis)