【转】[完结] 取结构偏移 和 取地址符号的 思考

【转】 取结构偏移 取地址符号的 思考

66

取到偏移,不多不少。。。 这里讲到了 多一个&.少一个&的区别

14 #define FIND(structTest,e) (size_t)&(((structTest*)0)->e)

15

16 int main()

17 {

18     size_t s = FIND(test,b);

19     //test t;

20     cout<<s<<endl;

21

22     char c;

23     cin>>c;

24     return 0;

25 }

 

 

仔细看第14行代码,发现这个宏非常奇怪,没错,就是用来求偏移的。我们知道宏的本质是替换,在预编译的时候会替换代码,那么里面有什么玄机了?

 

我发现其实此法是用了欺骗编译器的技巧来求得偏移的

 

取地址符‘&’决定表达式不会出现访问内存错误,因为默认0强制转化为结构体指针类型后是不能访问的地址,由于有地址符,所以不会实际产生访问变量的代码。

 

而‘->’最本质的就是队0加上后面变量在结构体中的偏移,这样 “0 + 偏移”就求得了我们要求的值。

感觉此代码非常巧妙,虽然不免有人说是愚弄编译器的伎俩,但是记下无妨,仍然觉得此法的甚妙。

 

源文档 <https://www.google.com/reader/view/feed/http%3A%2F%2Fwww.cnblogs.com%2FHappyAngel%2Frss#stream/feed%2Fhttp%3A%2F%2Fwww.cnblogs.com%2FHappyAngel%2Frss>

原文地址:https://www.cnblogs.com/titer1/p/2425816.html