结构具有联合时的意外大小
Unexpected size when a struct has a union
我正在尝试验证结构的大小。由于某些原因,它给了我 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
__attribute__((__packed__))
仅指 struct def
。它不会将匿名 struct
打包到 struct def
.
中的匿名 union
中
很可能是那两个成员
unsigned short a; /* 2 bytes */
unsigned short b; /* 2 bytes */
"use" 4 但 2 个字节。
与您的问题无关:C 要求使用 z
长度修饰符 :
打印 size_t
s
printf("size of DEF = %zu\n", sizeof (DEF));
写作:
struct foo {
struct bar {
...
} x;
};
和写作没什么区别:
struct bar { ... };
struct foo {
struct bar x;
};
为什么重要?这很重要,因为在第二个示例中,应用到 foo
的属性不会自动应用到 bar
的原因应该很明显。这意味着您的外部结构将被打包,但这不会改变组件的含义。
你拥有的内部结构不会被打包,很明显,如果它遵循通常的对齐规则,大多数架构遵循它的大小将是其最严格对齐的成员的倍数,这将是指针。因此,联合内结构的大小将为 16,而不是您假设的 12。这意味着联合的大小也将是 16。
我正在尝试验证结构的大小。由于某些原因,它给了我 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
__attribute__((__packed__))
仅指 struct def
。它不会将匿名 struct
打包到 struct def
.
union
中
很可能是那两个成员
unsigned short a; /* 2 bytes */
unsigned short b; /* 2 bytes */
"use" 4 但 2 个字节。
与您的问题无关:C 要求使用 z
长度修饰符 :
size_t
s
printf("size of DEF = %zu\n", sizeof (DEF));
写作:
struct foo {
struct bar {
...
} x;
};
和写作没什么区别:
struct bar { ... };
struct foo {
struct bar x;
};
为什么重要?这很重要,因为在第二个示例中,应用到 foo
的属性不会自动应用到 bar
的原因应该很明显。这意味着您的外部结构将被打包,但这不会改变组件的含义。
你拥有的内部结构不会被打包,很明显,如果它遵循通常的对齐规则,大多数架构遵循它的大小将是其最严格对齐的成员的倍数,这将是指针。因此,联合内结构的大小将为 16,而不是您假设的 12。这意味着联合的大小也将是 16。