C语言中的联合体的由来和存储

一、联合体的由来

1.1. 数据类型的不足

C语言中,基本数据类型只有整型、字符型、浮点型等少数几种,无法满足复杂数据类型的需要。

1.2. 数组的限制

虽然数组可以存储多个同类型的数据,但是数组中的元素个数是固定的,无法动态地改变大小。

1.3. 结构体的限制

结构体中的成员变量都是独立的,它们在内存中的地址是连续的,无法同时指向多个变量。

为了解决以上问题,C语言引入了联合体(union)这一复合数据类型。联合体是由一组不同类型的变量组成的集合,这些变量共享同一块内存空间,也就是说,联合体中只有一个成员变量在某一时刻是有效的。

二、联合体的使用方法

2.1. 定义联合体类型

使用关键字union和大括号{}来定义联合体类型,其中包含若干个成员变量。例如:

c 复制代码
union Student {
    char name[20];
    int age;
    float score;
};

上述代码定义了一个名为Student的联合体类型,它包含三个成员变量:name(字符串类型)、age(整型)和score(浮点型)。

2.2. 声明联合体变量

声明联合体变量时,需要指定其类型为已定义的联合体类型。例如:

c 复制代码
union Student stu1, stu2;

上述代码声明了两个Student类型的联合体变量stu1和stu2。

2.3. 访问联合体成员变量

通过"."运算符来访问联合体变量中的成员变量。需要注意的是,由于联合体中只有一个成员变量在某一时刻是有效的,因此访问不同的成员变量时,之前的成员变量的值会被覆盖掉。例如:

c 复制代码
strcpy(stu1.name, "Tom"); // stu1.name有效,其他成员变量无效
stu1.age = 18; // stu1.age有效,其他成员变量无效
stu1.score = 90.5; // stu1.score有效,其他成员变量无效

上述代码分别给stu1的name、age和score成员变量赋值。由于联合体中只有一个成员变量在某一时刻是有效的,因此每次赋值操作都会覆盖掉之前的成员变量的值。如果需要同时保存多个值,可以使用结构体或者指针来实现。

三、联合体在计算机中的存储方式

3.1. 内存对齐

为了提高内存读写效率,编译器会对联合体进行内存对齐。内存对齐是指将联合体中的成员变量按照一定的规则排列在内存中,使得它们的地址都是某个特定值的倍数。例如,对于一个int类型的变量,它的地址必须是4的倍数;对于一个char类型的变量,它的地址必须是1的倍数。如果某个成员变量按照默认对齐方式排列后,其地址不是某个特定值的倍数,编译器会在其前面填充一些空白字节,使其地址变为某个特定值的倍数。例如:

c 复制代码
union Student {
    char name[20]; // 地址为0x00000000,不需要对齐
    int age;       // 地址为0x00000004,需要对齐,填充3个空白字节(即地址为0x00000004)
    float score;   // 地址为0x00000008,需要对齐,填充3个空白字节(即地址为0x00000008)
};

上述代码中,Student联合体的大小为16个字节(2+4+4=12),因为name数组后面有3个空白字节(即sizeof(name)=12)。需要注意的是,不同的编译器可能会对联合体的内存对齐方式和大小计算方法有所不同。因此,在编写程序时应该尽量避免依赖于具体的内存布局细节。

3.2. 联合体的大小计算

联合体的大小等于其最大成员变量的大小。如果成员变量之间有空白字节,那么这些空白字节也会被计算在内。例如:

c 复制代码
union Student {
    char name[20]; // 占用20个字节(包括末尾的'\0')
    int age;       // 占用4个字节(假设为int类型)
    float score;   // 占用4个字节(假设为float类型)
};
相关推荐
啟明起鸣6 小时前
【网络编程】简易的 p2p 模型,实现两台虚拟机之间的简单点对点通信,并以小见大观察 TCP 协议的具体运行
c语言·网络·tcp/ip·p2p
秋说11 小时前
【PTA数据结构 | C语言版】线性表循环右移
c语言·数据结构·算法
芯岭技术12 小时前
MS32C001-C单片机,32位ARM M0+内核,宽电压、低功耗、小封装。
c语言·arm开发·单片机
minji...14 小时前
数据结构 算法复杂度(1)
c语言·开发语言·数据结构·算法
秋说15 小时前
【PTA数据结构 | C语言版】在顺序表 list 的第 i 个位置上插入元素 x
c语言·数据结构·list
楼田莉子16 小时前
数据学习之队列
c语言·开发语言·数据结构·学习·算法
秋说16 小时前
【PTA数据结构 | C语言版】返回单链表 list 中第 i 个元素值
c语言·数据结构·list
双叶83617 小时前
(C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)
c语言·开发语言·数据结构·c++·list
七七七七0717 小时前
类与对象【下篇】-- 关于类的其它语法
c语言·开发语言·c++
削好皮的Pineapple!17 小时前
C语言模块化编程思维以及直流电机控制(第四天)
c语言·开发语言·单片机