

struct sdshdr 结构体中的最后一个 char buf[] 被称为 flexible array member,在计算结构体大小的时候是不记入在内的,因此 sizeof(struct sdshdr) 实际上就是 sizeof(unsigned int) + sizeof(unsigned int) 这样就能理解了。
----------- |5|0|redis| ----------- ^ ^ sh sh->buf
所谓的 sizeof(struct sdshdr) 实际上是就是 len 和 free 所占的大小,因此用 sh->buf 的位置减去 sizeof(struct sdshdr) 就是 sh 的位置了,再经过 struct sdshdr * 转换,就可以得到 sds 对应的 struct sdshdr 结构体了。
参考资料:
本文出自:http://blog.sloger.info/, 原文地址:http://sloger.info/posts/convert-sds-to-sdshdr-with-sizeof-in-redis, 感谢原作者分享。
