如何在结构体中使用offsetof()函数?

10

我想在mystruct1中获取参数行的offsetof()。我已经尝试过了。

offsetof(struct mystruct1, rec.structPtr1.u_line.line) 

还有

offsetof(struct mystruct1, line)  

但都不起作用。

union {
    struct mystruct1 structPtr1;
    struct mystruct2 structPtr2;
} rec;

typedef struct mystruct1 {
    union {
        struct {
            short len;
            char buf[2];
        } line;

        struct {
            short len;
        } logo;

    } u_line;
};

1
你能否提供可编译的结构定义代码呢?或者省略struct mystruct2... - Jonathan Leffler
1
你说的“都不行”是什么意思? - MK.
1
请注意,在此示例中不需要使用关键字 typedef。这是一个虚无的用法,因为没有给出名称来成为 struct mystruct1 的别名。 - Jonathan Leffler
4个回答

14
< p > offsetof() 宏接受两个参数。C99 标准在 §7.17 <stddef.h> 中有所说明:

offsetof(type, member-designator)

which expands to an integer constant expression that has type size_t, the value of which is the offset in bytes, to the structure member (designated by member-designator), from the beginning of its structure (designated by type). The type and member designator shall be such that given

static type t;

then the expression &(t.member-designator) evaluates to an address constant.

所以,您需要编写:

offsetof(struct mystruct1, u_line.line);

然而,我们可以观察到由于mystruct1包含一个作为第一(也是唯一)成员的union,因此答案将会是零,并且它的line部分是联合体的一个元素,所以它将位于偏移量0处。

展示一个使用的例子会很好,无论它有多短(声明结构并使用 offsetof)。 - Evan Carroll
有一些问题我会展示例子,包括在C语言中找到结构体元素的偏移量 - Jonathan Leffler

2

你的struct mystruct1有一个名为u_line的成员。你可以看到该成员的偏移量。

offsetof(struct mystruct1, u_line); // should be 0

如果您指定每个“父级别”,则可以向下查看成员或子级别。
offsetof(struct mystruct1, u_line.line);
offsetof(struct mystruct1, u_line.line.buf);
offsetof(struct mystruct1, u_line.logo);

2

-1
首先,据我所知,offsetof仅用于结构体的直接成员(我的理解正确吗?)。
其次,了解流行的offsetof实现的内部细节,我建议尝试。
offsetof(struct mystruct1, u_line.line) 

这应该可以工作。对于我来说,它是否符合标准是一个开放的问题。

P.S. 根据@Jonathan Leffler的答案,这实际上应该可以工作。


1
我这样理解对吗?我不这么认为(在测试gcc后)。gcc接受“深层”成员在offsetof表达式中。 - pmg
1
@pmg:这样的问题其实无法通过“测试”来回答。 - AnT stands with Russia
正确的 @Andrey。Jonathan回答中发布的标准引用允许使用 offsetof 访问“深层”成员。 - pmg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接