代码之家  ›  专栏  ›  技术社区  ›  jestro

如果结构中只包含字符,是否有填充?

c
  •  0
  • jestro  · 技术社区  · 3 年前
    struct dummy {
        unsigned char a;
        unsigned char b;
        unsigned char c;
    };
    

    这是否会导致在任何情况下添加填充?

    2 回复  |  直到 3 年前
        1
  •  4
  •   paxdiablo    3 年前

    虽然这是不寻常的,但是 实施本身 决定该结构是否具有填充,而不是标准(本例中为C11)。

    《标准》规定 6.7.2.1 Structure and union specifiers

    14/结构或联合对象的每个非位字段成员以适合其类型的实现定义方式对齐。

    15/在结构对象中,非位字段成员和位字段所在的单元的地址按声明顺序递增。经过适当转换的结构对象指针指向其初始成员(如果该成员是位字段,则指向其所在的单元),反之亦然。结构对象中可能有未命名的填充,但在其开头可能没有。

    17/结构或接头的末端可能有未命名的填充物。

    因此:

    • 14
    • 开始时不允许填充,但成员之间允许填充(从 15 ).没有什么是仅仅因为对齐的原因才允许填充的,填充是允许的 任何 要求 地址会随着后续成员的增加而增加, 根据它们的大小和排列,它们以尽可能小的数量增加。
    • 17 ),无论出于什么原因。
        2
  •  2
  •   Craig Estey    3 年前

    你的 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=%zu\n",sizeof(struct dummy));
        printf("dummy2=%zu\n",sizeof(struct dummy2));
    
        return 0;
    }
    

    dummy=3
    dummy2=8
    

    没有填充物, dummy 应该是3,它是什么 .

    dummy2 应该是7,但它是8。那么,第二个呢 结构 char foo