开发者

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 given

static 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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜