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

最佳答案

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

关于c - 带填充结构的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13016404/

10-11 22:05
查看更多