结构中数组的内存分配

时间:2013-05-08 07:07:33

标签: c arrays memory struct zmalloc

我读了redis的代码,它定义了一个struct:

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),数组的内存地址是否在结构后面?

1 个答案:

答案 0 :(得分:1)

zn->level(一个灵活的数组成员)有一些固定的偏移量w.r.t. zn:如果zn位于地址0x10000,则zn->level[0]可能位于地址0x10018,因为指针robj将占用一个8字节的字(假设64位x86机器)并且双score将占用另一个8字节字 - 并且应该是字对齐 - 并且指针backward将占用另一个字。所以zn->level被3个字偏移,即24个字节(即十六进制为0x18)。

BTW,编译器或ABI可以在您的结构中插入间隙(用于对齐或符合ABI)。在您的特定示例中,它可能不会(在Linux / x86-64上使用GCC)。

您可能会对标准offsetof宏感兴趣,当然还有sizeof“运算符”。