从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。
您链接到的评论适用于 C++ 而不是 C。它不适用于 C。
此外,它并没有说
offsetof
不能用于(不是“调用”;它不是函数)指针成员(即,作为指针的结构的成员)。它说 offsetof
不能用于成员指针。
成员指针是 C++ 的东西,在 C 中不存在。它是一种特殊的指针,引用类上下文中的成员。 (它不是一个可以单独使用的独立指针。)
所以你不能在 C 中的成员指针上使用
offsetof
的原因是 C 中不存在这样的东西。