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


posted @   namezhyp  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示