Possible Duplicate:
Why does this C code work?
How do you use offsetof() on a struct?
我在互联网上读到了这个 offsetof 宏,但它没有解释它的用途。
#define offsetof(a,b) ((int)(&(((a*)(0))->b)))
它想要做什么以及使用它的优势是什么?
最佳答案
R.. 对问题第二部分的回答是正确的:在使用现代 C 编译器时不建议使用此代码。
但是要回答你问题的第一部分,它实际上在做什么:
(
(int)( // 4.
&( ( // 3.
(a*)(0) // 1.
)->b ) // 2.
)
)
从内到外工作,这是......
- 将值零转换为结构指针类型
a*
- 获取该(非法放置的)结构体对象的结构体字段 b
- 获取此
b
字段的地址 - 将地址转换为
int
从概念上讲,这是将一个结构对象放置在内存地址零处,然后找出特定字段的地址是什么。这可以让您计算出结构中每个字段在内存中的偏移量,以便您可以编写自己的序列化器和反序列化器以在结构与字节数组之间进行转换。
当然,如果您实际上取消引用零指针,您的程序将会崩溃,但实际上一切都发生在编译器中,并且在运行时没有实际的零指针被取消引用。
在大多数 C 运行的原始系统中,int
的大小是 32 位,与指针相同,所以这实际上是有效的。
关于c - C offsetof 宏如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38849515/