宏定义读取数据机构偏移量

来源:互联网 发布:c#书籍推荐知乎 编辑:程序博客网 时间:2024/05/01 09:33

          在c语言中如何得到一个field在结构体(struct)中的偏移量?若用宏定义该怎么写?

    ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((s*)0)的结果就是一个类型为s*的NULL指针。如果利用这个NULL指针来访问s的成员当然是非法的,但&(((s*)0)->m)的意图并非想存取s字段内容,而仅仅是计算当结构体实例的首址为((s*)0)时m字段的地址。聪明的编译器根本就不生成访问m的代码,而仅仅是根据s的内存布局和结构体实例首址在编译期计算这个(常量)地址,这样就完全避免了通过NULL指针访问内存的问题。0转化成结构体起始地址再取成员地址:&((类型 *)0->成员)别忘了了取址符号,否则内存读写错误,代码如下:
 

#include <stdio.h>

#define  MY_OFFSET(m,y) (&((m*)0)->y)

typedef struct _my_struct

{

   int a;

   int b;

   int c;

}mystruct;

 

int main()

{

   printf("a's offset of mystruct is %d\n",&((mystruct*)0)->a);

   printf("b's offset of mystruct is %d\n",&((mystruct*)0)->b);

   printf("b's offset of mystruct is %d\n",&((mystruct*)0)->c);

 

   printf("a's offset of mystruct is %d\n",MY_OFFSET(mystruct,a));

   printf("b's offset of mystruct is %d\n",MY_OFFSET(mystruct,b));

   printf("b's offset of mystruct is %d\n",MY_OFFSET(mystruct,a));

   return 0;

}

原创粉丝点击