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
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 k
8Byte对齐,所以总的大小就是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 i
4Byte向union借了4Byte用来对齐8Byte,union剩下8Byte正好对齐,double k正好对齐,所以总的大小就是8+8+8=24。