((struct name *)0) - > member)在C中做什么?

时间:2016-02-01 16:43:18

标签: c pointers struct

((struct name *)0) - > member)在C中做什么?

我遇到的实际C语句是:

(char *) &((struct name *)0)->member)

4 个答案:

答案 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*,虽然它不是有效指针,但它具有以下一个或两个属性:

  1. 将指针直接转换为整数类型将产生结构中指示成员的位移。

  2. 从指针中减去(char*)0将产生结构中指示成员的位移。

  3. 请注意,如果代码通过上述方式或任何其他方式形成无效指针值,即使代码不尝试取消引用指针,C标准也不会对此产生任何要求。虽然许多编译器生成具有指示质量的指针,但这种行为并不普遍。即使在指针和整数之间存在明显自然关系的平台上,一些编译器供应商可能会认为程序的行为与这种关系所暗示的一样,因此让编译器假定程序永远不会更“高效”。接收将导致生成无效指针的输入,因此,任何只有在收到此类输入时才相关的代码应该被省略。