#include<stdio.h>
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
?那么结构如何适应?如果我们使用malloc
和sizeof
分配一个联合数组,它会在这种情况下分配足够的空间吗?请详细说明。
答案 0 :(得分:6)
通常,联合的大小是其最大成员的大小。最大的成员[可能]是您的结构成员以及double
成员。两者的大小都是8.因此,正如sizeof
正确告诉你的那样,联合的大小确实是8。
为什么你觉得这很奇怪?你为什么称8“错误的价值”?
答案 1 :(得分:2)
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。
答案 2 :(得分:1)
union用于将多个成员放在同一个内存位置 - 一次不能使用多个成员。所有这些都重叠,因此联合的大小与最大成员的大小相同。
答案 3 :(得分:0)
联合类型是一种特殊结构,允许使用不同的类型描述访问相同的内存。例如,可以描述数据类型的并集,它允许读取与整数,浮点数或用户声明类型相同的数据
union
{
int i;
float f;
struct
{
unsigned int u;
double d;
} s;
} u;
在上面的例子中,u的总大小是u.s的大小(它是u.s.u和u.s.d的大小的总和),因为s大于i和f。在为u.i分配内容时,如果u.i小于u.f,则可以保留u.f的某些部分。