C语言中结构及联合概念的区别

Author: 江西 范明之 Date: 1996-11-29

        首先,我们来分析下面一段程序:
        main()
        {union EXPNAME {struct{int xx;intyy;}nn;
        int aa;int bb;}ee;
        ee.aa=1;ee.bb=2
        ee.nn.xx=ee.aa*ee.bb; ee.nn.yy=ee.aa+ee.bb;
        printf("%d%d.ee.nn.xx.ee.nn.yy);}
        问题的提出:
        程序中定义了联合类型union EXPNAME。同时直接定义具有联合型变量ee,其成员有结构型变量nn、两个整型变量aa、bb。程序运行结果:4 8。
        假如将程序中联合类型union EXPNAME定义成结构类型struct EXPNAME,则为一个结构嵌套形式,成员为;结构型变量nn,两整型变量aa.bb。程序运行结果;2 3。
        何以产生两种完全不同的结果呢?
        分析与说明:
        union类型在不同时间把不同属性的数据存放在同一内存区域,程序编译时若干类型数据共同占用同一段。以其中数据类型最长的成员而分配的内存单元,联合型变量一次只能容纳一个成员,最近在存入的成员起作用,该程序中联合类型的成员均为整型变量(在内存中长度是2字节),ee.aa、ee.bb、cc.nn.xx共享同一内存(2字节)。共享同一内存实质为变量“纵向覆盖式”占用内存。列表说明:共享内存单元(2字节)
        ee.nn.xx ee.nn.yy ee.aa ee.bb(nn为结构型变量:ee.nn.xx与ee.nn.yy占用内存单元并列)
        因此,ee.aa=1时,共享同一内存的三个变量ee.aa、ee.bb、ee.nn.xx均取值1;
        而ee.bb=2时,ee.aa、ee.nn.xx的值也为2,进行赋值运算ee.nn.xx=33.aa*ee.bb=2*2=4;当ee.nn.xx等于4时,ee.aa及ee.bb的取值均为4ee.nn.yy=ee.aa+ee.bb=8;
        所以行动结果为:48。
        当union联合类型改为struct结构类型时,变量不共享同一存储单元,而是所占内存长度是各成员所占内存长度之和,结构的多个成员同时存在,同时起作用,即结构型变量成员为同时存在,“横向并列式”占用各自分配内存。成员相对独立,互不干扰。列表说明:
        ee.nn.xx   ee.nn.yy   ee.aa    ee.bb←(4个结构型变量成员并列占用8个字节内存单元)
        因此ee.aa=1;ee.bb=2时;
        ee.nn.xx=ee.aa*ee.bb=1*2=2
        ee.nn.yy=ee.aa+ee.bb=1*2=3
        故而运行结果为2 3
        综上所述,结构与联合本质区别为:联合型变量成员“纵向覆盖式”共享同一内存、不同时存在、最近存入的成员起作用;结构型变量成员“横向并列式”占用各自分配的内存单元、同时存在、同时起作用。