在C

时间:2016-02-24 08:51:08

标签: c redis

我正在阅读redis的源代码。 这是代码:

typedef char *sds;

struct sdshdr {
    unsigned int len;
    unsigned int free;
    char buf[];
};

static inline size_t sdslen(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->len;
}

static inline size_t sdsavail(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->free;
}

关于此代码,我遇到了一些问题:

  1. 为什么sizeof(struct sdshdr) 8的输出?为什么不包括char buf[]
  2. 我无法理解函数size_t sdslensdsavail。为什么struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));

2 个答案:

答案 0 :(得分:1)

  1. 0大小的数组没有大小,声明的长度为0.这是一个灵活的数组成员;它只能出现在struct
  2. 的末尾
  3. 初始化将sh设置为指向通过取s的值char *计算的内存,并减去sds标头的大小。换句话说,从指向字符串的第一个字符的指针(灵活的数组成员),我们计算一个指向标题本身的指针,这样我们就可以获得长度。

答案 1 :(得分:1)

  • char buf []没有分配任何内存因此它不占用空间因此充当灵活数组因此2 int数据类型最终取4 + 4 = 8字节。

    <{1}}中的

  • ,传递的变量是size_t,属于s,是*sds <的typedef p>

    这导致在内存中实现此代码。

    char

    ,它存储的内存空间等于sh sdshdr struct。