代码之家  ›  专栏  ›  技术社区  ›  MegaRaman

为什么对指针成员调用offsetof()是非法的?

  •  0
  • MegaRaman  · 技术社区  · 3 周前

    从…起 there 我知道这是违法的 C 打电话 offsetof 在指针上,但为什么它是未定义的行为?标准实施

    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

    看起来甚至适合指针 MEMBER ,我不明白为什么它不起作用。

    架构示例,其中 int 是4个字节:

    #include <stddef.h>
    #include <stdio.h>
    
    struct foo {
        int a;
        int *ptr;
    };
    
    int main() {
        printf("Offset of ptr: %zu\n", offsetof(struct foo, ptr));
        return 0;
    }
    

    该代码将返回8,而如果 ptr 只是 int ,它将返回4。但在这两种情况下,该成员都处于相同的偏移量4上。

    编辑 :我做了错误的假设,上面提到的链接无效。正如所解释的,问题在于结构填充

    1 回复  |  直到 3 周前
        1
  •  1
  •   Eric Postpischil    3 周前

    您链接到的注释是针对C++而非C的。它不适用于C。

    此外,它没有说 offsetof 不能用于(未调用;它不是函数)指针成员(即作为指针的结构的成员)。上面写着 offsetof 不能用于成员指针。

    成员指针是C中不存在的C++东西。它是一种特殊类型的指针,指向类上下文中的成员。(它不是一个可以自己使用的独立指针。)

    所以你不能使用的原因 offsetof 在C中的成员指针上是C中不存在这样的东西。