首页 > 试题广场 >

typedef union { Short i;

[填空题]
typedef union {
    Short i;
    int k[5];
    char c;
} Mat;
Typedef struct {
    int i;
    Mat j;
    double k;
}Like;

则语句 printf("%d",sizeof(Like)+sizeof(Mat));的执行结果是:1
union一次只能使用其中的一个元素,因此只分配给union其中Size最大的元素的空间。此处int k[5]占用空间最大,20字节。
struct会对其中所有元素分配内存空间,int 4,Mat 20,double 8,一共是32字节。
编辑于 2018-08-19 17:34:37 回复(7)

union含数组 struct内存对齐

typedef union {
    Short i;
    int k[5];
    char c;
} Mat;
Typedef struct {
    int i;
    Mat j;
    double k;
}Like;

则语句 printf("%d",sizeof(Like)+sizeof(Mat));的执行结果是?
答案:32

Mat里面最大元素是int k[5]占20Byte,所以Mat的大小就是20Byte。

注意!!!Mat的长度大小是20Byte,并不是说Mat是一个以20Byte为单位的新数据,而是在内存中开辟了一段大小为20Byte的空间,至于空间中的数据类型是什么,是不确定的。Union只要保证连续的空间是最大的范围就行

其实struct与union一样,都是申请一段连续的内存空间,只不过struct更注重内存对齐。

所以在Like中,最大的成员是double k应该以8Byte对齐,也就是Like的大小是8的整数。然而在内存分配的时候Mat是作一个20Byte的空间,而且可以使用这20Byte的空间进行struct的内存对齐的。

所以在Link中,以8Byte对齐,int i占4Byte,从union中接着放4Byte来对齐8Byte,union中还剩下16Byte正好对齐,接着double k8Byte对齐,所以总的大小就是8+16+8=32Byte。

所以当union变换时:

typedef union {
    short i;
    int k[3];
    char c;
    float f;  //即使有float也不影响下面struct对齐的时候,给int i借4Byte
} Mat;
typedef struct {
    int i;
    Mat j;
    double k;
}Like;
sizeof(Like) = 24

根据上面所说,union只是一个12Byte的空间,可以在struct中被用来填充内存对齐,所以在struct中int i4Byte向union借了4Byte用来对齐8Byte,union剩下8Byte正好对齐,double k正好对齐,所以总的大小就是8+8+8=24。

发表于 2021-01-28 09:57:12 回复(2)
不说下是32位还是64位么,32位 就是52.
发表于 2019-10-11 10:42:43 回复(0)
MAT的内存应该是最大内存元素既int k[5]的20字节,然后Like的内存计算应该是4+20+8这是32字节,按最大字节数double的8字节的最小倍数对齐,应该就是32字节的内存,不需要补齐。所以结果就是20+32=52字节。
发表于 2019-09-14 15:07:17 回复(0)
20+(4+4)+(4+4)+(4+4)+8=52这样理解可以吧 struct最大类型字节对齐double为8的整数倍 第一个4是int 对齐字节不够所以找mat借一个int对齐,
发表于 2023-12-10 17:43:03 回复(0)
Union主要有以下区别: 1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。 在struct中,各成员都占有自己的内存空间,它们是同时存在的。 一个struct变量的总长度等于所有成员长度之 和。 在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。 Union变量的长度等于最长的成员的长度。 
发表于 2021-09-02 22:25:30 回复(0)
最大成员类型是double,而不是Mat(int k[5]);其次double 8字节对齐,而int + Mat 正好是8的倍数,因此不用再补字节
发表于 2020-09-02 09:11:41 回复(0)
sizeof(MAT)的大小为20毋庸置疑,但是在结构体内应该以最大的数据类型,也就是double为标准来对齐,开辟结构体的内存空间,所以在int i应该+4进行内存对齐,  MAT j应该+4=24进行内存对齐  最终应该是8+24+8=40;  加上之前的20应该为60。
求大神进行解析?

发表于 2019-03-02 13:52:16 回复(3)
这个题目有点不懂,为什么sizeof(Like)中没有考虑内存对齐的问题,按照我的理解:sizeof(Like)应该等于60
原因为:
int i:4个字节
MAT j:20个字节,但是考虑到内存对齐 需要补充16字节
double k:8个字节,最后补12个字节
总共是60个字节 请问我这样对不对啊 ,错在哪里了啊
发表于 2018-08-25 18:59:54 回复(6)
20+4+20+8=52
发表于 2021-12-19 15:36:07 回复(0)
#include<iostream>
using namespace std; 
int main()
{

typedef union {
    int i;
    int k[5];
    char c;
}Mat;
typedef struct {
    int i;
    Mat j;
    double k;
}Like;
 printf("%d",sizeof(Like)+sizeof(Mat));
}
发表于 2021-11-30 19:22:20 回复(0)
忘记求和了,我这个笨脑瓜
发表于 2021-04-01 13:49:22 回复(0)
啊,大意了,输出的是like和mat结构体之和,=32+20=52
发表于 2021-02-17 22:28:58 回复(0)