把“0”强制转化为结构体指针类型得到成员变量的偏移量

时间:2023-01-17 19:08:25
#include <stdio.h>
  
#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





}