2017-04-14 83 views
-1
union u 
{ 
    int a; 
    float b; 
    char c[10]; 
}; 
int main() 
{ 
    union u abc; 
    printf("\n%d",sizeof(abc)); 
} 

输出:12 我希望可以将输出为10.sizeof(焦炭)为1。因此,对于10我希望它是10.一个人能解释我为什么我们得到12.的sizeof字符数组不正确打印

+2

有填充。 – jxh

+2

标题:'sizeof char array',(char c [10])。代码:'sizeof(abc)',(工会)。为什么要声称一件事,然后证明另一件事 – ThingyWotsit

+1

你问关于数组(标题)的大小还是联合(代码)的大小? – chux

回答

2

这是因为可能至少有一个floatint数据类型有4个字节的对齐要求。所以struct得到2个字节的填充(所以sizeof(struct u) % 4 == 0)。

如果您的编译器支持它们以避免填充,您可以使用__attribute__((packed))或类似的功能,但除非预先存在符合的数据,否则不方便。考虑一下包装struct u元素的数组将具有未对齐的成员的事实。

+0

“这是因为float(和int)具有4个字节的对齐要求。 - >可能只是其中的一个具有16位'int'的需求。 – chux

+1

@chux:是的,在大多数非嵌入式平台上,它们大都是4字节,在真正依赖的嵌入式平台上。我不确定半精度浮动,肯定用于计算机图形学,但没有线索嵌入式架构可以使用它作为'浮动'的直接替代。 – Jack