我正在阅读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 sdslen
和sdsavail
函数。为什么要struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
? 最佳答案
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/