C语言中共用体(深入学习)

c语言中共用体的关键字为union,解释为一种特殊的构造数据类型。其定义方式和类型说明和结构体非常相识。但是具体实例化时在内存方面,union和struct却完全不同。

struct 是按照成员类型,如果没有指定对齐方式的情况下,会以默认方式对齐。但是union则不一样,它是所有成员公用一段内存。为成员中最大的元素分配内存。

如例一: union UN_1

{

int a;

float b;

double  c;

}u1={45};

大部分编译情况下,int=4Byte;float=4Byte ;double=8Byte。

初步断定,则该共用体是占用8Byte,再考虑对齐要素,该union最大的元素为8。初步计算union的长度为8,8/8=0;故该共用体的长度为8个Byte。

如例二: union UN_2

{

char a_1[10];

float b_1;

double  c_1;

}u2={45.0};

此时char a_1[10],占用10个字节,故初步该union变量至少需要10个Byte,去存储。然后考虑到该结构体的最大对齐数=基类型数据最大的数据=double=8Byte。10/8!=0,故该结构体必须往后延长。16/8=0。故该union的长度为16个字节。

例二中,我在定义结构体类型时,同时定义了结构体变量,还对变量进行了初始化化。接下来我们在主函数中打印结构体变量的成员值

int main()
{   
    printf("u.a的值%d\n",u1.a);
    printf("u.b的值%f\n",u1.b);
    printf("u.c的值%f\n",u1.c);
    return 0;
}

看结果

发现没有,系统默将初始化的{45};赋值给第一个成员int a。其他成员默认为0.

接下来修改

例三:

union UN_3

{

char a_2[10];

float b_2;

double  c_2;

}u2={45.0,46.0,47.0};

再看测试结果:。一样的会忽略后面的46.0和47.0。

union还有一个问题

例四:
 

#include <stdio.h>
#include <stdlib.h>

union UN_4

{

 unsigned int a_3;

float b_3;

double  c_3;

};

int main()

{

union UN_4 u3;  //定义一个共用体变量u3

 u3.a_3=10;

printf("输出 u3.a_3所占用字节的大小%d\n",sizeof(u3.a_3)); //打印出 u3.a_3所占字节的大小
printf("输出u3的大小%d\n",sizeof(u3));

u3.b_3= -40.0;  //C规范定义float类型数据,最高BIT位,必须是符号位。故编译器在编译时,必须

//要在不同的时候,分配不同的8个字节中,最高位的意义

printf("输出 u3.b_3所占用字节的大小%d\n",sizeof(u3.b_3)); //打印出 u3.b_3所占字节的大小

u3.c_3 = -50.0;
printf("输出 u3.c_3所占用字节的大小%d\n",sizeof(u3.c_3)); //打印出 u3.c_3所占字节的大小


}

看输出结果:

这里还有一个知识点,当用sizeof(),计算union变量的成员变量的大小时。并不是8Byte。这一点需要特别注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值