具有填充的结构的大小

时间:2012-10-22 17:15:31

标签: c memory-management struct structure

我有以下结构。在侧面计算尺寸的地方。填充后结构的大小应为30Bytes。但是大小是28。结构尺寸28如何?

#include <stdio.h>
struct a
{
    char t;      //1 byte+7 padding byte      Total = 8bytes
    double d;    //8 bytes                    Total = 16bytes
    short s;     //2 bytes                    Total = 18Bytes
    char arr[12];//12 bytes 8+8+4+12=32.      Total = 30Bytes
};
int main(void)
{
    printf("%d",sizeof(struct a));  // O/p = 28bytes
    return 0;
}

6 个答案:

答案 0 :(得分:5)

您可以使用offsetof来了解每个结构成员之后的实际填充:

#include <stddef.h>

printf("Padding after t: %zu\n", 
    offsetof(struct a, d) - sizeof (((struct a *) 0)->t));

printf("Padding after d: %zu\n",
    offsetof(struct a, s) - offsetof(struct a, d)
    - sizeof (((struct a *) 0)->d));

printf("Padding after s: %zu\n",
    offsetof(struct a, arr) - offsetof(struct a, s)
    - sizeof (((struct a *) 0)->s));

printf("Padding after arr: %zu\n",
      sizeof(struct a) - offsetof(struct a, arr)
      - sizeof (((struct a *) 0)->arr));

正如R.所写,你可能在32-bit系统上,double的对齐方式是4个字节而不是8个。

答案 1 :(得分:4)

您错误地计算了字节填充。这件事取决于编译器选项和其他东西。您应该查看pragma的pack指令,以显示填充的正确值。例如:

#pragma pack(show)

应该通过警告的方式显示字节填充。您还可以明确地设置它以根据您的需要定制代码。在msdn上查找。链接在这里 http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.71%29.aspx

答案 2 :(得分:2)

我认为它在32位边界上对齐,而不是64.这个怎么样:

struct a
{
    char t;      //1 byte+3 padding bytes     Total = 4bytes
    double d;    //8 bytes                    Total = 12bytes
    short s;     //2 bytes+2 padding bytes    Total = 16Bytes
    char arr[12];//12 bytes 4+8+4+12=28.      Total = 28Bytes
};

答案 3 :(得分:2)

我怀疑你是在32位架构上构建的,其中double没有8字节对齐要求,在这种情况下,对齐变为:

struct a
{
    char t;      //1 byte+3 padding byte      Total = 4bytes
    double d;    //8 bytes                    Total = 12bytes
    short s;     //2 bytes                    Total = 14Bytes
    char arr[12];//12 bytes +2 padding bytes  Total = 28Bytes
};

答案 4 :(得分:1)

在这种情况下,对于每个结构成员,内存以4bytes的倍数给出,

char t - 4bytes,double d - 8bytes,short s - 4bytes and char arr [12] - 12bytes。

总计4(字符)+8(双)+4(短)+12(字符数组)= 28字节

答案 5 :(得分:0)

最有可能的是,char后面跟着3个字节的填充(所以double在4字节边界上开始),short也跟着2个字节的填充。

但是......为什么不打印成员补偿来亲眼看看?