gpt4 book ai didi

c - 结构体中数组的内存分配

转载 作者:行者123 更新时间:2023-11-30 15:49:05 24 4
gpt4 key购买 nike

我看了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),数组的内存地址在结构体后面?

最佳答案

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

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

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

关于c - 结构体中数组的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16434673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com