我正在阅读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;
}

关于此代码,我有一些问题:
  • 为什么sizeof(struct sdshdr) 8的输出?为什么不包括char buf[]
  • 我无法理解size_t sdslensdsavail函数。为什么要struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
  • 最佳答案

  • char buf []尚未分配任何内存,因此不占用空间,因此它充当灵活的数组,因此2 int数据类型最终占用4 + 4 = 8字节。
    size_t中的
  • ,传递的变量是s,它属于*sds,它是char的typedef

    这导致该代码在内存中的实现。
    if (init) {
        sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
      } else {
        sh = zcalloc(sizeof(struct sdshdr)+initlen+1);
      }
      if (sh == NULL) return NULL;
      sh->len = initlen;
      sh->free = 0;
      if (initlen && init)
        memcpy(sh->buf, init, initlen);
      sh->buf[initlen] = '\0';
      return (char*)sh->buf;
    }
    

    它存储的内存空间等于sh sdshdr结构。
  • 关于c - `sizeof`在C中的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35597350/

    10-15 09:55