gpt4 book ai didi

c - C中 `sizeof`的用法

转载 作者:IT王子 更新时间:2023-10-29 06:05:23 25 4
gpt4 key购买 nike

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

最佳答案

  • 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 - C中 `sizeof`的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35597350/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com