C 难以理解宏的偏移量

C 难以理解宏的偏移量,c,pointers,memory,macros,offsetof,C,Pointers,Memory,Macros,Offsetof,我一直在寻找关于offsetof宏实现的详细解释(最后的链接): #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 特别是,取消对NULL的引用以获得结构中成员的偏移量。许多文章通过说空指针实际上从未真正取消引用来掩盖原因,但这对我来说没有意义 以下是我尝试理解的一些链接: 我正在寻找并试图理解的是一步一步的,对编译器如何解释宏定义的详细理解,这将最终解释空指针实际上是如何被取消引用的 编辑:

我一直在寻找关于offsetof宏实现的详细解释(最后的链接):

#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马丁:谢谢你的链接,它提供了我想要的详细信息。你的编辑使它更加清晰。这就是我希望找到的解释。