<分区>
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)))
它试图做什么以及使用它的优势是什么?
<分区>
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
字段的地址int
从概念上讲,这是在内存地址零处放置一个结构对象,然后找出特定字段的地址。这可以让你计算出结构中每个字段在内存中的偏移量,这样你就可以编写自己的序列化器和反序列化器来将结构与字节数组相互转换。
当然,如果您实际上取消引用零指针,您的程序会崩溃,但实际上一切都发生在编译器中,并且在运行时没有真正的零指针被取消引用。
在大多数 C 运行的原始系统中,int
的大小是 32 位并且与指针相同,所以这确实有效。
关于c - C offsetof 宏是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897877/