【发布时间】:2012-08-06 09:24:37
【问题描述】:
为什么在结构中查找字段偏移量的代码不给出段错误?
#define offset(structName,fieldName) (&((structName *)0)->fieldName)
【问题讨论】:
-
很有趣,通常人们会问为什么他们的代码确实会出现段错误...
-
可能;从技术上讲,这是未定义的行为。但是大多数编译器会将其优化为一个常数,因此在这些编译器中,这可以用作 offsetof() 的实现。通常,offsetof() 的实现由编译器决定; gcc 确实使用了 __builtin_offsetof()。
-
关于 offsetof 的维基百科页面提供了一些线索:en.wikipedia.org/wiki/Offsetof
-
而与编译器一起提供的库可以做这样的事情,因为库确切地知道编译器会用它做什么。作为程序员,你不应该(除非你不关心可移植性并且编译器明确保证它)。
-
未定义的行为并不意味着“这会崩溃”。这意味着行为未定义。