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

问题描述 投票:0回答:1

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 linux language-design offsetof
1个回答
1
投票

您链接到的评论适用于 C++ 而不是 C。它不适用于 C。

此外,它并没有说

offsetof
不能用于(不是“调用”;它不是函数)指针成员(即,作为指针的结构的成员)。它说
offsetof
不能用于成员指针。

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

所以你不能在 C 中的成员指针上使用

offsetof
的原因是 C 中不存在这样的东西。

© www.soinside.com 2019 - 2024. All rights reserved.