Possible Duplicates:
Does the 'offsetof' macro from <stddef.h> invoke undefined behaviour?
  dereferencing the null pointer




    #define _OFFS_OF_MEMBER(p_type, p_member) (size_t)&(((p_type *)NULL)->p_member)

    struct a
    {
             int a, b;
    };

    size_t l = _OFFS_OF_MEMBER(struct a, b);


我与一些其他用户进行了一些聊天/对话,其中一个用户说这是取消引用并访问地址NULL附近的地址空间。我说过:取得成员的地址将不会访问,触摸或读取该成员的值。根据标准,它是完全安全的。

    struct a* p = NULL;
    size_t offset = &p->b; // this may NOT touch b, it is not dereferencing
    // p->b = 0; // now, we are dereferincing: acccess violation time!


这始终是计算偏移量的安全方法,还是编译器可以根据标准自由地取消引用并弄乱地址NULL附近的内存?

我知道有一种安全的方法可以计算标准提供的偏移量,但是我很好奇您对此有何评论。所有人都赞成我的表态:投票赞成这个问题:-)

最佳答案

您不会在这里取消引用任何无效的内容。宏所做的全部工作就是告诉编译器,内存中地址为p_type的类型为NULL的结构。然后,它使用p_member的地址,该地址是此虚拟结构的成员。因此,在任何地方都不会取消引用。

实际上,这正是offsetof中定义的stddef.h宏所做的。

编辑:
正如某些评论所言,这可能不适用于C ++和继承,我只在C中将offsetof与POD结构一起使用。

关于c++ - 这是有效的ANSI C++代码吗?尝试在编译时生成结构成员的偏移量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6683411/

10-11 22:43
查看更多