• 结构体 偏移量 (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

  • 相关阅读:
    转-jsonp和jsonpcallback的使用
    转-jQuery jsonp跨域请求
    转-彻底弄懂JS的事件冒泡和事件捕获
    转-打造自己的js类库
    (转)JavaScript: 零基础轻松学闭包(1)
    Myslq 之主键
    Myslq 之空值与非空
    Myslq 之记录查找
    Myslq 之插入记录
    Myslq 之查看数据表
  • 原文地址:https://www.cnblogs.com/liujx2019/p/12619478.html
Copyright © 2020-2023  润新知