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'
的类型转换。这是什么意思?
答案 0 :(得分:3)
是的,这是尝试实施offsetof
。他们将结构指针的开头设置为0,这样b
的地址就会指示其偏移量。
然而,这不是好代码。首先,取消引用空指针(与->b
一样)是未定义的行为,即使除了指向它之外没有对该值进行任何操作。其次(这是它变得奇怪的地方),空指针 - 尽管被写成0
- 并不保证实际上在内存中的位置0,因此结果转换为int不一定是偏移量会员。
如果某些标准库实现旨在与愿意处理这些违反标准的问但是,您不应该在自己的代码中依赖它。这是offsetof
的用途。