联合体UNION的内存占用计算

typedef union{
    int b[5];   //20
    long long c;   //8
}DATA;

有如上这么一段程序片,int占用4个字节,long long占用8个字节,
使用sizeof计算如上DATA的空间大小时,

sizeof(DATA) = 24

而不是20。

关于union空间的计算,有如下几点需要注意:

  1. 大于等于最大的成员长度,此处应该是大于等于20;
  2. 满足(1)条件下最大的成员类型(union的对齐大小)的最小倍数,及长度要是大于20的前提下的8的倍数,即24;
  3. 存放变量时将会从内存中的同一位置开始,后面的变量将会覆盖以前的变量,但是如果占用的内存小于前者,那么以前未被覆盖的内存存储对象将会保持不变。

关于第三点,举例说明,有如下代码片段:

    DATA a;
    printf("0x%x\n", &a);
    memset(&a,0, sizeof(a));
    a.b[0] = 0x11111111;
    a.b[1] = 0x22222222;
    a.b[2] = 0x33333333;
    a.b[3] = 0x44444444;
    a.b[4] = 0x55555555;
    /* -----------分割线---------- */
    a.c = 0x1122334455667788;

在分割线以前,内存中的数据是这样的,
在这里插入图片描述
而在执行了如下代码以后,

a.c = 0x1122334455667788;

内存区的数据变成了如下图所示,可以看到,继续赋值的话从变量地址头部开始覆盖掉了之前的数据。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值