1. 共用体占用的内存不小于共用体中最大的成员占用的内存 (必要不充分)
1.1代码
union data20_01{
int a;
double b;
char c;
}data20_01_1;
union data20_02{
int a;
char b;
}data20_02_1;
union data20_03{
int a;
char b;
char c[8];
}data20_03_1;
/* 1.共用体占用的内存等于共用体中最大的成员占用的内存 */
void test_20_01(){
printf("sizeof(data20_01)=%d\n",sizeof(data20_01));
printf("sizeof(data20_02)=%d\n",sizeof(data20_02));
printf("sizeof(data20_03)=%d\n",sizeof(data20_03));
}
1.2 执行结果
2.共用体占用的内存应是成员字节对齐值的倍数
2.1 代码
/* 2.共用体占用的内存应是成员字节对齐值的倍数 */
union data20_04{//字节对齐值为1,共用体占9字节
char a;
char b[9];
}data20_04_1;
union data20_05{//字节对齐值为2,共用体占10字节
short a;
char c[9];
}data20_05_1;
union data20_06{//字节对齐值为4,共用体占12字节
int a;
char b;
char c[9];
}data20_06_1;
union data20_07{//字节对齐值为8,共用体占16字节
int *a;
char b;
char c[9];
}data20_07_1;
void test_20_02(){
printf("sizeof(data20_04)=%d\n",sizeof(data20_04));
printf("sizeof(data20_05)=%d\n",sizeof(data20_05));
printf("sizeof(data20_06)=%d\n",sizeof(data20_06));
printf("sizeof(data20_07)=%d\n",sizeof(data20_07));
}
2.2 执行结果
3. 先内层、再外层(先计算内层的字节对齐值,及占用内存)
3.1 代码
/* 先内层、再外层*/
struct struct20_01{//字节对齐值为1 结构体占3字节
char a[2];
char b;
};
struct struct20_02{//字节对齐值为2 结构体占4字节
short a;
char b;
};
struct struct20_03{//字节对齐值为4 结构体占12字节
short a;
int b;
char c;
};
struct struct20_04{//字节对齐值为8 结构体占16字节
short *a;
int b;
char c;
};
union data20_08{//字节对齐值为2,共用体占10字节
short a;
struct20_01 struct20_01_01;//字节对齐值为1 结构体占3字节
char c[9];
}data20_08_1;
union data20_09{//字节对齐值为4,共用体占12字节
struct20_03 struct20_03_01;//字节对齐值为4 结构体占12字节
char b;
char c[9];
}data20_09_1;
union data20_10{//字节对齐值为8,共用体占16字节
struct20_04 struct20_04_01;//字节对齐值为8 结构体占16字节
char b;
char c[9];
}data20_10_1;
union data20_11{//字节对齐值为8,共用体占24字节
struct20_04 struct20_04_02;//字节对齐值为8 结构体占16字节
char b;
char c[17];
}data20_11_1;
union data20_12{//字节对齐值为8,共用体占16字节
struct20_03 struct20_03_02;//字节对齐值为4 结构体占12字节
char *b;
char c[9];
}data20_12_1;
void test_20_03(){
printf("sizeof(struct20_01)=%d\n",sizeof(struct20_01));
printf("sizeof(struct20_02)=%d\n",sizeof(struct20_02));
printf("sizeof(struct20_03)=%d\n",sizeof(struct20_03));
printf("sizeof(struct20_04)=%d\n",sizeof(struct20_04));
printf("sizeof(data20_08)=%d\n",sizeof(data20_08));
printf("sizeof(data20_09)=%d\n",sizeof(data20_09));
printf("sizeof(data20_10)=%d\n",sizeof(data20_10));
printf("sizeof(data20_11)=%d\n",sizeof(data20_11));
printf("sizeof(data20_12)=%d\n",sizeof(data20_12));
}
3.2 执行结果
4. 在同一时间只能使用一个变量
4.1 代码
/* 4.在同一时间只能使用一个变量 */
union data20_13{//
char a;
short b;
int c;
}data20_13_1;
union data20_14{//
char a;
short b;
int c;
int *d;
}data20_14_1;
void test_20_04(){
data20_13_1.a = 'a';
printf("data20_13_1.a=%c\n",data20_13_1.a);
printf("********************\n");
data20_13_1.b = 20;
printf("data20_13_1.a=%c\n",data20_13_1.a);
printf("data20_13_1.b=%d\n",data20_13_1.b);
printf("********************\n");
data20_13_1.c = 74497;
printf("data20_13_1.a=%c\n",data20_13_1.a);
printf("data20_13_1.b=%d\n",data20_13_1.b);
printf("data20_13_1.c=%d\n",data20_13_1.c);
printf("***********************************\n");
data20_14_1.a = 'b';
printf("data20_14_1.a=%c\n",data20_14_1.a);
printf("********************\n");
data20_14_1.b = 20;
printf("data20_14_1.a=%c\n",data20_14_1.a);
printf("data20_14_1.b=%d\n",data20_14_1.b);
printf("********************\n");
data20_14_1.c = 14;
printf("data20_14_1.a=%c\n",data20_14_1.a);
printf("data20_14_1.b=%d\n",data20_14_1.b);
printf("data20_14_1.c=%d\n",data20_14_1.c);
}
4.2 执行结果
参考:c学习28