我希望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;
};
答案 0 :(得分:7)
offsetof()
宏有两个参数。 C99标准说(在§7.17<stddef.h>
中):
offsetof(type, member-designator)
扩展为类型为
size_t
的整数常量表达式,其值为 这是结构成员的偏移量(以字节为单位)(由member-designator指定), 从其结构的开头(按类型指定)。类型和成员指示符 应该是给定的static type t;
然后表达式
&(t.member-designator)
计算为地址常量。
所以,你需要写:
offsetof(struct mystruct1, u_line.line);
但是,我们可以观察到答案将为零,因为mystruct1
包含union
作为第一个成员(并且仅),并且line
部分是一个元素联合,所以它将在偏移0处。
答案 1 :(得分:2)
答案 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的回答来看,这实际上应该有效。