奇怪的sizeof导致MVC(对齐?)

时间:2016-11-15 17:00:42

标签: c alignment sizeof

以下代码给出了结果 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;
}

2 个答案:

答案 0 :(得分:0)

对于alignment reasons,编译器可以自由插入填充。这意味着结构的大小不一定等于各个成员的大小总和。这是C标准明确允许的。

在结构的开头,即在第一个成员之前,不允许填充的唯一地方。

来自C11 draft, 6.7.2.1

  

在结构对象中,非位字段成员和单位   哪些位字段驻留的地址按顺序增加   他们被宣布。适当地指向结构对象的指针   转换后,指向其初始成员(或者如果该成员是   位字段,然后到它所在的单元,反之亦然。   结构对象中可能有未命名的填充,但不在其中   开始。

(强调我的)。

答案 1 :(得分:0)

现在大多数计算机只能在几天内分配“单词”(也就是8个字节,也就是64位)。它被称为填充。

将其视为酒店客房。无论您有1人还是2人(chars)入住同一房间(memory location),房间大小都相同。