#include
typedef union{
double I;
int nk[5];
char cC;
}DATE;
struct date{
char nCat;
DATE cow;
double dDog;}too;
DATE max;
int main()
{
printf("%d",sizeof(struct date)+sizeof(max));
return 0;
}
已知sizeof(struct date)=40,sizeof(max)=24,请问是怎么算的呢
首先,这段代码中定义了一个共用体和一个结构体。共用体DATE中包含了一个double类型的变量I,一个长度为5的整型数组nk,以及一个字符型变量cC。结构体date中只包含了一个字符型变量cha。
共用体的特点是所有成员共享同一块内存空间,因此对于共用体来说,每次给其中一个成员赋值,都会影响到其它成员的值。在本例中,如果给DATE中的nk数组赋值,那么I和cC的值都会发生变化。
结构体的特点是其成员占用不同的内存空间,不同成员之间互不干扰。在本例中,结构体date中的cha成员和DATE中的I、nk、cC成员都占用不同的内存空间。
以下是一个示例代码,演示了共用体和结构体的内存使用情况:
#include <stdio.h>
typedef union{
double I;
int nk[5];
char cC;
} DATE;
struct date{
char cha;
};
int main() {
DATE d;
d.I = 3.14;
printf("d.I = %f\n", d.I); // 输出3.140000
printf("d.nk[0] = %d\n", d.nk[0]); // 输出0,因为double类型占8个字节,而int类型只占4个字节,因此在共用体中将double类型拆分成了两个int类型。
printf("d.cC = %c\n", d.cC); // 输出空字符
struct date dt;
dt.cha = 'a';
printf("dt.cha = %c\n", dt.cha); // 输出a
return 0;
}
现代编译器为了优化内存访问,会在结构体里填充一些间隙,使得每个成员的起始位置都是4的倍数(或者8的倍数)
比如说char[5],下一个成员就不是正好在后面,可能是浪费3个字节
这叫做对其(aligning)
不同编译器的做法还不一样,所以说单看代码,没有办法确定,如果能确定,也就没必要sizeof运算符了,就是没法确定,才需要