问题的背景
这两天在研究字节对齐的问题,偶然看到了博客园某位答主的代码:
/* OFFSET宏定义可取得指定结构体某成员在结构体内部的偏移 */
#define OFFSET(st, field) (size_t)&(((st*)0)->field)
typedef struct{
char a;
short b;
char c;
int d;
char e[3];
}T_Test;
int main(void){
printf("a-%d, b-%d, c-%d, d-%d\n",
OFFSET(T_Test, a),
OFFSET(T_Test, b),
OFFSET(T_Test, c),
OFFSET(T_Test, d));
printf("a-%d\n", (size_t)&(((T_Test*)0)->a));
return 0;
}
这段代码的用途是查看结构中每个字段的偏移地址,程序的输出如下:
a-0, b-2, c-4, d-8
a-0
问题
我的问题是
#define OFFSET(st, field) (size_t)&(((st*)0)->field)
这个宏定义中的 (size_t)&(((st*)0)->field)
是如何起作用的,((st*)0)
不是一个 st* 类型的空指针吗,为什么能够通过它访问 T_Test 中的字段。