[英]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.