问我如何确定结构中某个字段的字节偏移量?
答ANSI C 在offsetof()宏定义于<stddef.h>中,它允许你计算结构s中字段f为的偏移量:offsetof(struct s, f)。如果出于某种原因你必须自己编写这类代码,一种可能的方式是:
#define offsetof(type, f) ((size_t) \ ((char *)&((type *)0)->f - (char *)(type *)0))
此实现并非 100% 可移植;某些编译器可能会合法地拒绝接受它。
(上述定义的复杂性需要稍作解释。减去一个经过仔细转换的空指针,即使空指针的内部表示不是 0,也应该能保证计算出一个简单的偏移量。这些强制类型转换是为了(void *)确保计算出的偏移量是字节偏移量。不可移植性在于,即使只是为了地址计算的目的,也假设有一个类型的实例位于地址 0。但请注意,由于这个假设的实例实际上并未被引用,因此不太可能发生访问违例。)
参考:ISO Sec. 7.1.6
Rationale Sec. 3.5.4.2
H&S Sec. 11.1 pp. 292-3