我确实看到定义了一个宏来计算结构偏移,如下所示
#define offsetof(st, m) ((size_t)(&((st *)0)->m))
但我不知道这个定义是如何运作的。看起来像是通过NULL
指针访问结构的成员。任何人都可以详细说明这个表达式的工作原理吗?
答案 0 :(得分:1)
此表达式在编译时进行了优化,从而导致程序中的编译时偏移值。
编译器看到一个常量指针(0),看到它的常量偏移量,只是应用constant folding,产生地址0 + offset
(== offset),这就是我们需要的。
有趣的是,它是否在没有任何优化的情况下工作,或者总是进行一些基本的常量折叠。
P.S。更准确地说,这种优化被称为Scalar Replacement of Aggregates
,正如下面的雷某所指出的那样。
答案 1 :(得分:1)
1)首先是指向类型' st'的结构的空指针。创建:(st *)0
2)接下来采用这种结构的成员: - > m
3)接下来会员的地址为:&(...)
4)最后,成员的地址被强制转换为size-t类型:(size_t)(...)
工作发生在第3步,因为指针为空(即地址== 0),然后成员的地址只包含结构中的成员位置。