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;
} logo;
} u_line;
};
Solution 1:
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.
Solution 2:
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.