c学习-31 共用体学习

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值