• 结构体 偏移量 (size_t)&(((s *)0)->m) , list相关


    在Windows SDK 的stddef.h 中

    #define offsetof(s,m)   (size_t)&(((s *)0)->m)

    应用例如

    #define list_container(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))


    ((s *)0):强制转化成数据结构指针,并使其指向地址0;
    ((s *)0)->m:使该指针指向成员m
    &(((s *)0)->m):获取该成员m的地址
    (size_t)&(((s *)0)->m):转化这个地址为合适的类型
     
    ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((s*)0)的结果就是一个类型为s*的NULL指针。如果利用这个NULL指针来访问s的成员当然是非法的,但&(((s*)0)->m)的意图并非想存取s字段内容,而仅仅是计算当结构体实例的首址为((s*)0)时m字段的地址。聪明的编译器根本就不生成访问m的代码,而仅仅是根据s的内存布局和结构体实例首址在编译期计算这个(常量)地址,这样就完全避免了通过NULL指针访问内存的问题。又因为首址的值为0,所以这个地址的值就是字段相对于结构体基址的偏移。
    ————————————————
    版权声明:本文为CSDN博主「me败家懒妞」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_42615308/java/article/details/86001794

  • 相关阅读:
    模-数(A/D)转换器
    数-模(D/A)转换器
    VIM 常用命令
    Linux常用命令
    一个开关电源传导、辐射处理案例-----Layout环路
    解决:PADS导入.DXF结构图出现坐标超出范围问题
    Python3-threading模块-多线程
    Python3-socketserver模块-网络服务器框架
    Python3-socket模块-低级网络接口
    Python3-面向对象
  • 原文地址:https://www.cnblogs.com/liujx2019/p/12619478.html
走看看 - 开发者的网上家园