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/