((struct name *)0) - > member)在C中做什么?
我遇到的实际C语句是:
(char *) &((struct name *)0)->member)
答案 0 :(得分:25)
这是获取名为struct
的{{1}}成员的偏移量的技巧。这种方法背后的想法是让编译器计算member
的地址,假设结构本身位于零地址。
使用offsetof
提供了一种更易读的语法替代方法:
member
答案 1 :(得分:6)
(struct name *)0
正在将0
投射到指向struct name
的指针
&((struct name *)0)->member)
正在获取成员member
的地址
(char *) &((struct name *)0)->member)
正在将该地址转换为char *
。
如果有人认为上面的表达式是取消引用NULL
指针,请注意这里没有解除引用。只需获取会员number
的地址即可。
答案 2 :(得分:5)
(struct name*)0
为您提供了一个结构指针。
((struct name*)0)->member
为您提供指针指向的结构的成员。
添加&
会为您提供该成员的地址,最后为
(char *)
是将获取的地址强制转换为char指针。
答案 3 :(得分:1)
在许多编译器中,上面的表达式将产生char*
,虽然它不是有效指针,但它具有以下一个或两个属性:
将指针直接转换为整数类型将产生结构中指示成员的位移。
从指针中减去(char*)0
将产生结构中指示成员的位移。
请注意,如果代码通过上述方式或任何其他方式形成无效指针值,即使代码不尝试取消引用指针,C标准也不会对此产生任何要求。虽然许多编译器生成具有指示质量的指针,但这种行为并不普遍。即使在指针和整数之间存在明显自然关系的平台上,一些编译器供应商可能会认为程序的行为与这种关系所暗示的一样,因此让编译器假定程序永远不会更“高效”。接收将导致生成无效指针的输入,因此,任何只有在收到此类输入时才相关的代码应该被省略。