如何在结构上使用 offsetof() ?

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

我想要

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;
};
c struct offset
3个回答
14
投票

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

offsetof(type, member-designator)

它扩展为一个具有类型

size_t
的整型常量表达式,其值是 这是结构成员(由成员指示符指定)的字节偏移量, 从其结构的开始(由类型指定)。类型和成员指示符 应是给定的

static type t;

然后表达式

&(t.member-designator)
计算结果为地址常量。

所以,你需要写:

offsetof(struct mystruct1, u_line.line);

但是,我们可以观察到答案将为零,因为

mystruct1
包含
union
作为第一个成员(也是唯一的),并且它的
line
部分是并集的一个元素,因此它将位于偏移 0。


2
投票

您的

struct mystruct1
有 1 位名为
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);

-1
投票

首先,据我所知,

offsetof
仅用于结构体的直接成员(我的说法正确吗?)。

其次,了解流行的

offsetof
实现的内部细节,我可以建议尝试

offsetof(struct mystruct1, u_line.line) 

这应该有效。它是否符合标准对我来说是一个悬而未决的问题。

附注从@Jonathan Leffler 的回答来看,这实际上应该有效。

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