Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
584 views
in Technique[技术] by (71.8m points)

c - Union element alignment

If I have a union, C standard guarantees that the union itself will be aligned to the size of the largest element.

union U {
    long l;
    int i;
    short s;
    char c[2];
} u;

But what does it say about alignment of individual union elements inside the union? Is the following expression guaranteed to be true?

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0])
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The start of each element is aligned with the address of the union itself.

so the individual comparisons in the expression you ask about are true, but the expression as a whole is false unless the union is located at address 0x0001.

The deleted text applied to the following comparisons:

&u.l == &u.i == &u.s == &u.c[0]

The revised version compares distinct pointer types - the pointers should be cast to void pointers.


I was asked to quote the standard - or identify the section of the standard.

C99 - section 6.7.2.1 Structure and union specifiers (paragraph 14):

A pointer to a union object, suitably converted, points to each of its members (or if a member is a bitfield, then to the unit in which it resides), and vice versa.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...