3

我有以下结构。其中尺寸是在侧面计算的。填充后结构的大小应为 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;
}
4

6 回答 6

6

您可以使用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 个字节的系统上。

于 2012-10-22T17:24:29.970 回答
4

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

#pragma pack(show)

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

于 2012-10-22T17:24:07.290 回答
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
};
于 2012-10-22T17:21:11.053 回答
2

double我怀疑您正在构建一个没有 8 字节对齐要求的 32 位架构,在这种情况下,对齐变为:

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
};
于 2012-10-22T17:21:55.770 回答
1

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

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

总计 4(char)+8(double)+4(short)+12(char array)=28bytes

于 2012-10-23T14:32:47.557 回答
0

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

但是......为什么不打印成员偏移量自己看看呢?

于 2012-10-22T17:20:44.673 回答