码迷,mamicode.com
首页 > 其他好文 > 详细

测试[ uinon_struct ]

时间:2015-07-16 19:18:13      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

#include <stdio.h>

//#define _TEST    // 切换显示不同结构体排列,内存空间占用情况

//----------------------联合体定义----------------------
typedef union
{
    unsigned char uiVal;            // 联合体的大小是1Byte
    struct
    {
        unsigned char bit0    :1;
        unsigned char bit1    :1;
        unsigned char bit2    :1;
        unsigned char bit3    :1;
        unsigned char bit4    :1;
        unsigned char bit5    :1;
        unsigned char bit6    :1;
        unsigned char bit7    :1;
    }Byte;
}MyUnion;

//----------------------结构体定义----------------------
typedef struct
{
    #ifdef _TEST
        // 变量排列顺序1
        // 对于 Data0 先开辟一个 4Byte空间 但是它本身只占用了 1Byte 剩余3Byte
        // 然后 Data1 试图去紧挨着 Data0 存放 但是发现只能存放3Byte 还有1Byte没地方存放,所以它再次开辟4Byte空间来存放自己
        // 最后 Data2 发现 Data1 已经独占了 4Byte空间 自己也重新开辟 4Byte空间
        // 因此,总共占用空间为 4+4+4 = 12Byte
        // 其中第一个 4Byte空间只存放了 1Byte的变量 其余3Byte闲置
        // 第三个4Byte空间也值存放了2Byte 闲置2Byte
        unsigned char       Data0;        // 1Byte
        unsigned int        Data1;        // 4Byte    
        unsigned short int  Data2;        // 2Byte

    #else
        // 变量排列顺序2
        // 对于 Data0 先开辟一个 4Byte空间 但是它本身只占用了 1Byte 剩余3Byte
        // 然后 Data1 发现 Data0 开辟的4Byte空间还有3Byte是空的 而自己本身只需要2Byte空间就够了 所以就紧挨着 Data0 存放
        // 最后 Data2 发现 Data0 Data1 在第一个4Byte空间中已经用去了3Byte 仅剩1Byte空间 而自己需要4Byte空间 所以需要重新开辟 4Byte空间
        // 因此,总共占用空间为 4+4 = 8Byte
        // 其中第一个 4Byte空间只存放了 3Byte的变量 其余1Byte闲置
        unsigned char         Data0;        // 1Byte
        unsigned short int    Data1;        // 2Byte
        unsigned int          Data2;        // 4Byte
    #endif
    
}RECORD;


//----------------------用户变量----------------------
MyUnion DataVal;

RECORD m_Record;    // 统计数据



//----------------------主函数----------------------
void main()
{
    //----------------------
    DataVal.uiVal = 0x79;

    printf("sizeof_MyUnion = %d Byte \n\n",sizeof(DataVal.uiVal));
    printf("DataVal.Byte.bit7 = %d \n",DataVal.Byte.bit7);
    printf("DataVal.Byte.bit6 = %d \n",DataVal.Byte.bit6);
    printf("DataVal.Byte.bit5 = %d \n",DataVal.Byte.bit5);
    printf("DataVal.Byte.bit4 = %d \n",DataVal.Byte.bit4);
    printf("DataVal.Byte.bit3 = %d \n",DataVal.Byte.bit3);
    printf("DataVal.Byte.bit2 = %d \n",DataVal.Byte.bit2);
    printf("DataVal.Byte.bit1 = %d \n",DataVal.Byte.bit1);
    printf("DataVal.Byte.bit0 = %d \n\n\n",DataVal.Byte.bit0);

    //----------------------
    m_Record.Data0 = 0x12;
    m_Record.Data1 = 0x34;
    m_Record.Data2 = 0x56;

    printf("sizeof_m_Record.Data0 = %d \n",sizeof(m_Record.Data0));
    printf("sizeof_m_Record.Data1 = %d \n",sizeof(m_Record.Data1));
    printf("sizeof_m_Record.Data2 = %d \n",sizeof(m_Record.Data2));
    printf("sizeof_m_Record = %d Byte \n",sizeof(m_Record));
}

技术分享

测试[ uinon_struct ]

标签:

原文地址:http://www.cnblogs.com/zhangfan2014/p/4651935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!