如果我有一个联合,C标准保证联合本身将与最大元素的大小对齐.
union U {
long l;
int i;
short s;
char c[2];
} u;
Run Code Online (Sandbox Code Playgroud)
但它对联盟内各个联盟元素的对齐有什么看法呢?以下表达式是否保证是真的?
(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0])
Run Code Online (Sandbox Code Playgroud) struct {
uint64_t a; char z[120];
} b;
...
struct buffer_with_alignment_requirement* c = (struct buffer_w*)&b;
c->start_using_it;
Run Code Online (Sandbox Code Playgroud)
如果没有第一个成员a,我们可能会在访问缓冲区中的字段时崩溃.简单地添加这样的成员以强制整个结构的对齐是否足够严格,是否可移植且正确?
这不是关于指针别名的问题,只是关于b堆栈上的地址是否总是八字节对齐.