我有以下内容:
#include <stdio.h>
typedef union u_data
{
struct
{
int a;
int b;
int c;
};
int elem[3];
} my_data;
int main(void)
{
my_data data;
data.a = 3;
data.b = 5;
data.c = -3;
printf("%d, %d, %d\n", data.elem[0], data.elem[1], data.elem[2]);
}
它的工作原理与我预期的输出:3, 5, -3
但我知道结构可以有填充,所以这意味着结构中的元素可能不总是与数组对齐?
简介:这是实现定义的行为。如果编译器保证,您可以依赖某个系统上的某个行为。代码不可移植。
你正确地指出,你不能指望a
,b
和c
与elem
阵列对齐由于填充。
任何依赖相反的代码都不是便携式的C.
可以在struct
的成员之间引入填充以强制执行成员的个体对齐要求。
它按我的预期工作
看起来在你的情况下,成员的对齐要求已经实现,因此没有引入填充,这导致数组映射完美的struct
。
这是否意味着结构中的元素可能并不总是与数组对齐?
不,因为可以在struct
的成员之间引入填充。
这是否意味着结构中的元素可能并不总是与数组对齐?
没有。
您的代码调用未定义的行为。
数组elem
没有义务将(由于填充)对齐到结构的字段。