linux宏offset_of学习随笔

发布时间 2023-09-04 11:31:29作者: namezhyp

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)由于起始地址是零地址,这样就能直接求出偏移量。