关闭

linux 内核代码的offsetof()宏

285人阅读 评论(0) 收藏 举报
* 之前一直不理解((type *)0->member)是啥意思;甚至之前还在测试这种用法是否正确。
 * 这次在看list_entry的时候,又发现了这个用法。
 * 是在offsetof(type,member)中被调用的,
 * 原宏为:
#define offsetof(type,member) ((size_t) &((type *)0)->member)
 * size_t 是内核中的一种数据类型。是无符号的长整形。
 * 这个宏的作用是,计算元素member在其所在结构提type中的偏移量。
 * 那 看代码,还是不理解 。这不是在取member的地址么,还强制转化成size_t类型,
 * 怎么就是他在里面的偏移量了呢?甚至,用0->取元素,这种用法对还是错呢?
 * 哈哈,其实,重点就在用0->取元素上。
 *
 * 我们知道,定义结构体,内存会分配一块连续内存。结构体变量名也是该块连续内存的首地址。
 * 平时取元素 ,也是利用偏移量来进行操作。
 * 结构体内某一个元素的地址  =  结构体变量地址(即首地址)+ 偏移量。
 * 所以,如果结构体变量地址 == 0;
 * 该元素的地址 == 偏移量。
 * 所以,利用这样的小技巧,通过从0(NULL)作为首地址取元素,
 * 只要获取该元素的地址,就是该元素在其结构体内的偏移量了。

真的感叹c语言的巧妙,以及内核代码的构思,真真的灵活运用啊!
0
0
猜你在找
【直播】计算机视觉原理及实战——屈教授
【套餐】深度学习入门视频课程——唐宇迪
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】机器学习之凸优化——马博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7881次
    • 积分:148
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:44篇
    • 译文:0篇
    • 评论:0条