你如何在struct上使用offsetof()?

时间:2011-08-24 18:17:19

标签: c

我希望offsetof()是mystruct1中的参数行。我试过了

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;
};

4 个答案:

答案 0 :(得分:7)

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

offsetof(type, member-designator)
     

扩展为类型为size_t的整数常量表达式,其值为   这是结构成员的偏移量(以字节为单位)(由mem​​ber-designator指定),   从其结构的开头(按类型指定)。类型和成员指示符   应该是给定的

static type t;
     

然后表达式&(t.member-designator)计算为地址常量。

所以,你需要写:

offsetof(struct mystruct1, u_line.line);

但是,我们可以观察到答案将为零,因为mystruct1包含union作为第一个成员(并且仅),并且line部分是一个元素联合,所以它将在偏移0处。

答案 1 :(得分:2)

一篇很好的文章是:

Learn a new trick with the offsetof() macro

我在嵌入式代码中经常使用offsetof宏,以及文章中讨论的修改后的SIZEOF宏。

答案 2 :(得分:0)

您的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);

答案 3 :(得分:0)

首先,AFAIK,offsetof仅用于结构的直接成员(我是否正确?)。

其次,了解热门offsetof实施的内部细节,我建议尝试

offsetof(struct mystruct1, u_line.line) 

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

P.S。从@Jonathan Leffler的回答来看,这实际上应该有效。