【问题标题】:Memory allocation of array in a struct结构中数组的内存分配
【发布时间】:2013-05-08 07:07:33
【问题描述】:

我看了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),那么array的内存地址就在struct后面?

【问题讨论】:

    标签: c arrays memory struct zmalloc


    【解决方案1】:

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

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

    您可能会对标准的offsetof 宏以及sizeof“运算符”感兴趣。

    【讨论】:

      猜你喜欢
      • 2018-09-24
      • 2014-04-21
      • 2021-05-29
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多