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

时间:2012-07-25 04:42:05

标签: c sizeof structure unions

#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?那么结构如何适应?如果我们使用mallocsizeof分配一个联合数组,它会在这种情况下分配足够的空间吗?请详细说明。

4 个答案:

答案 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的某些部分。