以下代码给出了结果 sizeof(t1)= 16 sizeof(t2)= 16 我原以为sizeof(t2)= 12因为sizeof(fpos_t)= 8而sizeof(int)= 4。有人可以解释一下吗?
int main()
{
typedef struct {
fpos_t fpos;
char* s;
int a;
} t1;
typedef struct {
fpos_t fpos;
int a;
} t2;
t1 it1;
t2 it2;
printf("sizeof(t1)=%d sizeof(t2)=%d ", sizeof(t1), sizeof(t2));
return 0;
}
答案 0 :(得分:0)
对于alignment reasons,编译器可以自由插入填充。这意味着结构的大小不一定等于各个成员的大小总和。这是C标准明确允许的。
在结构的开头,即在第一个成员之前,不允许填充的唯一地方。
在结构对象中,非位字段成员和单位 哪些位字段驻留的地址按顺序增加 他们被宣布。适当地指向结构对象的指针 转换后,指向其初始成员(或者如果该成员是 位字段,然后到它所在的单元,反之亦然。 结构对象中可能有未命名的填充,但不在其中 开始。强>
(强调我的)。
答案 1 :(得分:0)
现在大多数计算机只能在几天内分配“单词”(也就是8个字节,也就是64位)。它被称为填充。
将其视为酒店客房。无论您有1人还是2人(chars
)入住同一房间(memory location
),房间大小都相同。