How do you use offsetof() on a struct?
I want the offsetof() the param line in mystruct1
. I've tried
offsetof(struct mystruct1, rec.structPtr1.u_line.line)
and also
offsetof(struct mystruct1, line)
but neither works.
union {
struct mystruct1 structPtr1;
struct mystruct2 structPtr2;
} rec;
typedef struct mystruct1 {
union {
struct {
short len;
char buf[2];
} line;
struct {
short len;
开发者_JAVA技巧 } logo;
} u_line;
};
The offsetof()
macro takes two arguments. The C99 standard says (in §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 givenstatic type t;
then the expression
&(t.member-designator)
evaluates to an address constant.
So, you need to write:
offsetof(struct mystruct1, u_line.line);
However, we can observe that the answer will be zero since mystruct1
contains a union
as the first member (and only), and the line
part of it is one element of the union, so it will be at offset 0.
Your struct mystruct1
has 1 member named u_line
. You can see the offset of that member
offsetof(struct mystruct1, u_line); // should be 0
or of members down the line if you specify each "level of parenthood"
offsetof(struct mystruct1, u_line.line);
offsetof(struct mystruct1, u_line.line.buf);
offsetof(struct mystruct1, u_line.logo);
A great article to read on this is:
Learn a new trick with the offsetof() macro
I use the offsetof macro frequently in my embedded code, together with the modified SIZEOF macro as discussed in the article.
Firstly, AFAIK, offsetof
is intended to be used with immediate members of the struct only (am I right on this?).
Secondly, knowing the internal details of popular offsetof
implementations I can suggest trying
offsetof(struct mystruct1, u_line.line)
This should work. Whether it is standard-compliant is an open question for me.
P.S. Judging by @Jonathan Leffler's answer, this should actually work.
精彩评论