解释包含结构的联合的sizeof运算符的结果

#include struct mystruct { char cc; float abc; }; union sample { int a; float b; char c; double d; struct mystruct s1; }; int main() { union sample u1; int k; u1.s1.abc=5.5; u1.s1.cc='a'; printf("\n%c %f\n",u1.s1.cc,u1.s1.abc); k=sizeof(union sample); printf("%d\n\n",k); return 0; } 

运算符的大小返回8我仍然能够访问结构元素,一次多个,并且sizeof运算符仍然返回我假设的原始数据类型的最大大小。 为什么会这样? 实际分配的大小是8吗? 并且sizeof返回错误的值? 或者实际分配的大小是8 ? 那么结构是如何适应的? 如果我们使用mallocsizeof分配一个联合数组,它会在这种情况下分配足够的空间吗? 请详细说明。

通常,联合的大小是其最大成员的大小。 最大的成员[可能]是你的struct成员以及double成员。 两者的大小都是8.因此,正如sizeof正确告诉你的那样,联合的大小确实是8。

为什么你觉得奇怪? 你为什么称8“错误的价值”?

 struct mystruct { char cc; //1 -byte //3 bytes Added here for Padding float abc; //size of float is 4-bytes }; 

所以1 + 3 + 4 = 8个字节。

我们知道将为最大的工会成员分配内存。 在我们的例子中,sizeof(double)= sizeof(struct mystruct)都是8。

联合用于将多个成员放在同一个内存位置 – 一次不能使用多个成员。 所有这些都重叠,因此联合的大小与最大成员的大小相同。

联合类型是允许使用不同类型描述访问相同内存的特殊结构。 例如,可以描述数据类型的并集,它允许读取与整数,浮点数或用户声明类型相同的数据

 union { int i; float f; struct { unsigned int u; double d; } s; } u; 

在上面的例子中,u的总大小是我们的大小(usu和usd的大小之和),因为s大于i和f。 当为ui分配内容时,如果ui小于uf,则可以保留uf的某些部分