struct dummy {
unsigned char a;
unsigned char b;
unsigned char c;
};
这会导致在任何情况下添加填充吗?
虽然这是不寻常的,但实现本身决定该结构是否有填充,而不是标准(在本例中为C11)。
6.7.2.1 Structure and union specifiers
中的标准状态(仅显示相关段落):
14/结构体或联合对象的每个非位域成员都以适合其类型的实现定义的方式对齐。
15/在一个结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。结构对象的指针经过适当转换后,指向它的初始成员(如果该成员是位域,则指向它所在的单元),反之亦然。在结构对象中可以有未命名的填充,但不能在其开头。
17/在结构体或联合体的末尾可以有未命名的填充。
:
- 实现定义对齐,因此填充(从
14
)。 - 开始时没有填充,但成员之间允许填充(来自
15
)。没有什么只允许出于对齐的原因进行填充,任何目的都允许填充,包括"实现者的突发奇想"。唯一的要求是地址随着后续成员的增加而增加,不是根据其大小和对齐方式增加尽可能小的数量。 - 允许在最后一个成员后填充(来自
17
),同样出于任何原因。
您的struct
没有有任何填充。
但是,如果你在c
之后添加了一些需要对齐的东西(例如int
),你将获得填充。
这是一个测试程序:
#include <stdio.h>
struct dummy {
unsigned char a;
unsigned char b;
unsigned char c;
};
struct dummy2 {
unsigned char a;
unsigned char b;
unsigned char c;
int foo;
};
int
main(void)
{
printf("dummy=%zun",sizeof(struct dummy));
printf("dummy2=%zun",sizeof(struct dummy2));
return 0;
}
程序输出:
dummy=3
dummy2=8
如果没有填充,dummy
应该是3,它是。
没有填充的dummy2
应该是7,但它是8。因此,第二个struct
添加了padchar
以使foo
对齐到4字节边界。