我正在通过this question来重申我对结构填充的理解。我现在有一个疑问。当我做这样的事情时:
floorEntry
输出:
#include <stdio.h>
#define ALIGNTHIS 16 //16,Not necessarily
union myunion
{
struct mystruct
{
char a;
int b;
} myst;
char DS4Alignment[ALIGNTHIS];
};
//Main Routine
int main(void)
{
union myunion WannaPad;
printf("Union's size: %d\n\
Struct's size: %d\n", sizeof(WannaPad),
sizeof(WannaPad.myst));
return 0;
}
我不应该期望结构被填充8个字节吗?如果我明确地将八个字节填充到结构中,那么将它嵌套在这样的联合中的整个目的是无效的。
我觉得声明一个包含结构和结构大小的字符数组的联合应该是但不是,为一个更简洁的代码让路。
是否有解决方法让它按照我的意愿工作?
答案 0 :(得分:2)
从逻辑上思考。
想象一下,我的联盟中有一些基本类型:
union my_union{
int i;
long l;
double d;
float f;
};
你会期待sizeof(int) == sizeof(double)
吗?
内部类型将始终是它们的大小,但联合将始终足够大以容纳其任何内部类型。
答案 1 :(得分:1)
默认struct
已填充,因此int b
字段在sizeof(int)
边界上对齐。有几种解决方法:
char a; char _a[sizeof(int)-1]; int b;
struct
答案 2 :(得分:1)
我不应该期望结构被填充8个字节吗?
不,因为struct mystruct
是自己看到/处理的。 char
已被 3 sizeof (int) -1
字节填充,以使int
正确对齐。这不会改变,即使有人在某个地方有时决定在另一种类型中使用这个struct mystruct
。