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

2018-06-18 04:05:20来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

  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* 。
其实道理大家都懂,就是强制转换了在进行指针的 加 减 运行 就是按 “字节”来的。
指针 http://www.cnblogs.com/yml435/p/4655463.html



null



标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:sizeof(char**),sizeof(char*), sizeof(char)小注

下一篇:TCP客户端 服务端详细代码