C 难以理解宏的偏移量
我一直在寻找关于offsetof宏实现的详细解释(最后的链接):C 难以理解宏的偏移量,c,pointers,memory,macros,offsetof,C,Pointers,Memory,Macros,Offsetof,我一直在寻找关于offsetof宏实现的详细解释(最后的链接): #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 特别是,取消对NULL的引用以获得结构中成员的偏移量。许多文章通过说空指针实际上从未真正取消引用来掩盖原因,但这对我来说没有意义 以下是我尝试理解的一些链接: 我正在寻找并试图理解的是一步一步的,对编译器如何解释宏定义的详细理解,这将最终解释空指针实际上是如何被取消引用的 编辑:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
特别是,取消对NULL的引用以获得结构中成员的偏移量。许多文章通过说空指针实际上从未真正取消引用来掩盖原因,但这对我来说没有意义
以下是我尝试理解的一些链接:
我正在寻找并试图理解的是一步一步的,对编译器如何解释宏定义的详细理解,这将最终解释空指针实际上是如何被取消引用的
编辑:
尽管其他问题回答了我的疑问,但正如原帖子所指出的,它们对我来说是有意义的。@dasblinkenlight的答案揭示了我与ansers在其他问题上遇到的确切问题,即我们如何没有实际取消对指针的引用
特别是,取消对NULL的引用以获得结构中成员的偏移量
指针没有解除引用,因为运算符->
的效果由运算符&
撤消:
- 这将是对
:NULL
((TYPE*)0)->成员的取消引用
- 在其前面添加
使其成为地址计算:&
&((TYPE*)0)->成员
int a;
int *p = &a;
int b = *p; // <<== This is a dereference
int *q = &(*p); // <<== This is not a dereference
inta;
int*p=&a;
int b=*p;//除了这个答案,你还需要什么?如果a
是地址1234的指针,而b
是偏移量12处a
的成员,那么&a->b
是什么?现在,如果a
指向地址0,那么&a->b
是什么?你是如何在不去引用a
的情况下在头脑中解决这个问题的?这是有道理的。我尝试了以下方法,您提供的解释是正确的:int*b=NULL;printf(“\n b的地址为%p\n”,&(*b))//无SEGFAULT打印F(“\n b的地址为%p,val为%d\n”,&(*b),*b)//赛格FAULT@Adam马丁:谢谢你的链接,它提供了我想要的详细信息。你的编辑使它更加清晰。这就是我希望找到的解释。