#define OFFSET(TYPE, MEMBER ) &((TYPE *)0)->MEMBER
struct A
{
int a;
char b[20];
double c;
char d;
};
void main()
{
int offsetA= (int ) ( &((A *)0)->a ); //偏移量
int offsetB= (int ) ( OFFSET(A, b) );
int offsetC= (int ) ( &((A *)0)->c );
int offsetD= (int ) ( OFFSET(A, d) );
/* 把“0”强制转化为指针类型,则该指针一定指向“0”(数据段基址)。
因为指针是“A*”型的,所以可取到以“0”为基地址的一个type型变量member域的地址.
那么这个地址也就等于member域到结构体基地址的偏移字节数。
*/
printf("%d ,%d, %d, %d\n", offsetA,offsetB,offsetC ,offsetD );
// 打印 0 ,4, 24, 32
}