data)"是什么意思-6ren"> data)"是什么意思-有一个结构 typedef struct _pack_t { char tag[4]; int type; size_t size; -6ren">
gpt4 book ai didi

c - "#define PACK_OFFSET ((size_t)((pack_t *)0)->data)"是什么意思

转载 作者:太空狗 更新时间:2023-10-29 15:20:04 25 4
gpt4 key购买 nike

有一个结构

typedef struct _pack_t {
char tag[4];
int type;
size_t size;
size_t offset;
char data[0];
} __attribute__((packed)) pack_t;

还有一个定义

#define PACK_OFFSET ((size_t)((pack_t *)0)->data)

定义是什么意思?以及如何理解指针“0”?

最佳答案

这是一个预处理器宏。它产生 pack_t 结构的 data 成员的偏移量。当其封闭结构的基地址为零时,它通过获取该成员的绝对地址来实现。

使用非 NULL 指针,这可以通过声明类型为 pack_t 的任何变量,然后获取结构地址和成员地址的差异(以字节为单位)像这样:

pack_t dummy;
size_t offset = (char *)&dummy.data - (char *)&dummy;

(但这不仅是无效的,因为减去的两个指针不指向同一个数组的元素,而且它还需要一个多余的局部变量,由于各种原因不需要它。这就是为什么这是聪明的使用空指针实现。)

(不要因为没有看到 addressof (&) 运算符而感到困惑 - data 是一种数组类型,因此它会衰减为指向其第一个元素的指针。 )

关于c - "#define PACK_OFFSET ((size_t)((pack_t *)0)->data)"是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15700975/

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