3

我正在尝试验证结构的大小。由于某些原因,它给了我 18 的大小,而不是预期的 14 字节(联合的最大值应该为 8 + 2 + 2 = 12 字节)。有人能帮我吗?

typedef struct __attribute__((__packed__)) def
{
        union {
                double x;   /* 8 bytes */
                char *y;    /* 8 bytes as for 64-bit system */
                struct {
                        struct def *array; /* 8 bytes */
                        unsigned short a;  /* 2 bytes */
                        unsigned short b;  /* 2 bytes */
                } z;
        } w;
        unsigned short v;  /* 2 bytes */
} DEF, *DEFP;

int main(int argc, char **argv) {
        printf("size of DEF = %lu\n", sizeof(DEF));
        printf("size of unsigned short = %lu\n", sizeof(unsigned short));
        printf("size of struct def * = %lu\n", sizeof(struct def *));
        printf("size of char * = %lu\n", sizeof(char *));
        printf("size of double = %lu\n", sizeof(double));
}

这是我运行它时显示的内容:

$ gcc test.c && ./a.out
size of DEF = 18
size of unsigned short = 2
size of struct def * = 8
size of char * = 8
size of double = 8
4

2 回答 2

3

__attribute__((__packed__))仅指struct def。它不会在匿名里面打包 struct匿名union里面struct def

所以很可能是这两个成员

                   unsigned short a;  /* 2 bytes */
                   unsigned short b;  /* 2 bytes */

“使用” 4 但 2 个字节。


与您的问题无关:C 要求使用长度修饰符size_t打印s :z

 printf("size of DEF = %zu\n", sizeof (DEF));
于 2018-02-14T07:42:45.130 回答
2

写作:

struct foo {
    struct bar {
        ...
    } x;
};

与写作没有什么不同:

struct bar { ... };
struct foo {
    struct bar x;
};

为什么这有关系?这很重要,因为在第二个示例中,为什么您应用的属性foo不会自动应用到bar. 这意味着您的外部结构将被打包,但这不会改变组件的含义。

您拥有的内部结构不会被打包,很明显,如果它遵循通常的对齐规则,大多数体系结构遵循它的大小将是其最严格对齐的成员的倍数,这将是指针。所以联合内部结构的大小将是 16,而不是您假设的 12。这意味着工会的规模也将是 16。

于 2018-02-14T07:51:35.583 回答