[英]Memory allocation of array in a struct
我阅读了redis的代码,它定义了一个结构:
typedef struct zskiplistNode {
robj *obj;
double score;
struct zskiplistNode *backward;
struct zskiplistLevel {
struct zskiplistNode *forward;
unsigned int span;
} level[];
} zskiplistNode;
它创建像这样的节点:
zskiplistNode *zn = zmalloc(sizeof(*zn)+level*sizeof(struct zskiplistLevel));
就是说,如果zn
的地址是0x10000
,那么&(zn->level[0])
是0x10000+sizeof(zskiplistNode)
,数组的内存地址在struct后面?
zn->level
(一个灵活的数组成员)具有一些固定的偏移量wrt zn
:如果zn
位于地址0x10000
,则zn->level[0]
可以位于地址0x10018
因为指针robj
将占用一个8字节的字(假定为64)位x86机器)和双精度score
将占用另一个8字节的单词-并且应将其与单词对齐-并且backward
的指针将占用另一个单词。 因此zn->level
偏移了3个字,即24个字节(即十六进制为0x18
)。
顺便说一句,编译器或ABI可能会在您的结构中插入空白(为了对齐或符合ABI)。 在您的特定示例中,可能不会(在Linux / x86-64上使用GCC)。
您可能对标准offsetof宏以及“ sizeof
”的sizeof
感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.