如题所述
共用体:
sizeof(union
data1)的值为16.在编译器默认设置的情况下,该共用体最大基本类型为double,它占8字节,所以此共用体以8来对齐。字符数组c2占9个字节,那么整个共用体应该占9个字节,但按照对齐原则,实际分配给它的内存为16字节。
结构体:
struct
data以8个字节对齐,long类型的成员1分配8个字节。s、i、c、a原本分别占4、2、1、10个字节。由于考虑到对齐,s分配4个字节,i分配
2个字节,c分配2个字节,此时刚好用完8个字节。a原本分配10个字节,由于考虑到对齐,要使整个结构体所占的存储空间是8的倍数,所以分配给它16个字节。因此结构体data占8+4+4+2+16=32个字节。
sizeof(union
data1)的值为16.在编译器默认设置的情况下,该共用体最大基本类型为double,它占8字节,所以此共用体以8来对齐。字符数组c2占9个字节,那么整个共用体应该占9个字节,但按照对齐原则,实际分配给它的内存为16字节。
结构体:
struct
data以8个字节对齐,long类型的成员1分配8个字节。s、i、c、a原本分别占4、2、1、10个字节。由于考虑到对齐,s分配4个字节,i分配
2个字节,c分配2个字节,此时刚好用完8个字节。a原本分配10个字节,由于考虑到对齐,要使整个结构体所占的存储空间是8的倍数,所以分配给它16个字节。因此结构体data占8+4+4+2+16=32个字节。
温馨提示:答案为网友推荐,仅供参考
第1个回答 2019-11-01
结果应该是12。
共用体所占的字节为各成员中占字节最多的成员的字节:
union
U
{
char
st[4];
/*4个字节*/
int
i;
/*4个字节*/
long
l;
/*4个字节*/
};
所以共为4个字节;
结构体所占字节为各成员字节相加之和:
struct
A
{
union
U
u;
/*4个字节*/
double
c;
/*8个字节*/
}a;
所以sizeof(a)应该为12个字节。
共用体所占的字节为各成员中占字节最多的成员的字节:
union
U
{
char
st[4];
/*4个字节*/
int
i;
/*4个字节*/
long
l;
/*4个字节*/
};
所以共为4个字节;
结构体所占字节为各成员字节相加之和:
struct
A
{
union
U
u;
/*4个字节*/
double
c;
/*8个字节*/
}a;
所以sizeof(a)应该为12个字节。
第2个回答 2019-11-07
你要看看每个变量的字节对齐方式:这是这题的重点
联合体:的大小是联合体中最大的那个变量的占用空间,因此上述联合体大小为4
结构体中,在内存分配空间时,首先分配联合体的空间4字节,然后当要分配double时,发现double的字节对齐方式是8字节对齐,因此double
c变量不会紧着接联合体的那个变量分配空间,而是会在联合体后空出4字节,然后分配,因此得到16字节=联合体4字节+空的4字节+double8字节
但是如果改成int
,int的字节对齐方式是4字节,联合体占用4字节,其后恰好是4字节边界,因此如果用int
则会在联合体后直接分配空间,就会得到8字节的大小
联合体:的大小是联合体中最大的那个变量的占用空间,因此上述联合体大小为4
结构体中,在内存分配空间时,首先分配联合体的空间4字节,然后当要分配double时,发现double的字节对齐方式是8字节对齐,因此double
c变量不会紧着接联合体的那个变量分配空间,而是会在联合体后空出4字节,然后分配,因此得到16字节=联合体4字节+空的4字节+double8字节
但是如果改成int
,int的字节对齐方式是4字节,联合体占用4字节,其后恰好是4字节边界,因此如果用int
则会在联合体后直接分配空间,就会得到8字节的大小