• 结构体成员地址获得结构体起始地址


    经常我们在一些开源的或者内核代码中会看到。

    1. #define TYPE_STRUCT(ptr, type, member)((type *)((char*)(ptr)-(unsigned long)(&((type *)0)->member)))
    就是由结构体的成员地址获得结构体的地址。
    参数:
    1. ptr :结构体的某个成员地址。
    2. type:结构体名
    3. member:该成员名
    这个就是很巧妙地利用了已知结构体的地址情况下用
    1. struct_ptr -> member
     利用"->"求成员的地址,其实就是
    1. 结构体首地址+偏移量
     来求得成员地址。
    于是我们把0地址强制转换成该结构体的地址,再用"->"来求偏移量:
    1. (unsigned long)(&((type *)0)->member))
    那么反过来用成员地址 “回退” 这个偏移量就得到了结构体 变量的首地址了。
    1. ((type *)((char*)(ptr)-(unsigned long)(&((type *)0)->member)))
    那么整个过程其实就是
    1. 结构体首地址=成员地址-该成员在该结构体里的偏移量

    注意:
        注意其中的
    1. ((type *)((char*)(ptr)
    它是首强制转换成了 char* 。
    其实道理大家都懂,就是强制转换了在进行指针的 加 减 运行 就是按 “字节”来的。





  • 相关阅读:
    java:第三章
    java:第一章
    java:第二章
    复制a.jpg到b.jpg
    安卓事件大全
    安卓事件
    read输入流与writer输出流的对比
    第五章:循环结构
    第三章:选择结构(一)
    第二章:变量,数据类型和运算符
  • 原文地址:https://www.cnblogs.com/yml435/p/6644776.html
Copyright © 2020-2023  润新知