linux宏offset_of学习随笔
offset_of 宏
定义:include/linux/stddfx.h
功能:给出两个参数:结构体和它的成员,获取其成员关于结构体首地址的偏移:
#define offset_of(type, member) (unsigned long) &((type*)0)->member
这个想法挺精巧的,逐层拆开,首先看里面的(type*)0 ,这是将0地址强行转换为了一个type结构体的指针。在这里我们先假设一个结构体:
typedef struct student{ char name[16]; int num; int age; }
对于这样的一个结构体,使用offset_of(type,member)时,会写成offset_of(student,num)这样的格式。
第二层,((type*)0)-> member ,这里要注意结合的顺序。这一层强转指针后,访问结构体的成员member。 放在例子里就是 ((student*)0)->num 即student->num
第三层,&((type*)0)-> member,这里已经是取巧了。利用了0地址。式子应该被理解成
&( ((type*)0)-> member ) ,即&(student->num)由于起始地址是零地址,这样就能直接求出偏移量。