gpt4 book ai didi

c - 使用 null 构造引用

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:11 24 4
gpt4 key购买 nike

int main()
{
typedef struct name
{
long a;
int b;
long c;
} r;
r re = { 3, 7, 5 };

printf("%d", ((unsigned int)&(( struct name *)0)->b));

printf("%d", ((int)&((struct name *)0)->a));

while(1);
}

我发现程序给出了结构体成员的偏移量。所以,可能类似于 offsetof()。但是,这是我第一次看到带有 '0' 的类型转换。这是什么意思?

最佳答案

是的,这是尝试实现offsetof。他们将结构指针的开头置于 0,这样 b 的地址将指示其偏移量。

但是,这不是好的代码。首先,取消引用一个空指针(如 ->b 所做的那样)是未定义的行为,即使除了获取指向它的指针之外没有对该值进行任何操作。其次(这就是它变得奇怪的地方),空指针——尽管写成 0——不能保证实际上位于内存中的位置 0,因此转换为 int 的结果不是必须是成员的偏移量。

一些标准库实现确实以这种方式实现了 offsetof,如果它们旨在与愿意处理那些违反标准的问题的编译器一起工作的话。但是,您不应该在自己的代码中依赖它。这就是 offsetof 的用途。

关于c - 使用 null 构造引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25837077/

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