c共用体

简介: c共用体

在C语言中,共用体(Union)是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。然而,与结构体(struct)不同,共用体在任一时刻只能有一个数据成员存储有效数据,因为它们共享同一块内存空间。这种特性使得共用体在某些特定场合下非常有用,如节省内存、处理多种数据类型以及与底层硬件交互等。

一、共用体的定义

共用体通过union关键字定义,其内部可以包含多个不同类型的数据成员。这些成员在内存中是重叠的,即它们使用同一块内存空间。下面是一个简单的共用体定义示例:

union MyUnion { 
int i; 
float f; 
char str[20]; 
};

在这个例子中,MyUnion是一个共用体类型,它包含了三个数据成员:一个整型i、一个浮点型f和一个字符数组str。然而,这些成员并不占据独立的内存空间,而是共享同一块内存。

二、共用体的内存占用

共用体的大小由其最大的成员决定。在上面的例子中,如果在一个32位系统上,整型(int)和浮点型(float)通常各占4个字节,而字符数组str则占用20个字节(不考虑内存对齐的情况)。但由于共用体的特性,MyUnion的实际大小将只等于其最大成员的大小,即20个字节(字符数组的大小)。

三、共用体的初始化与访问

在C语言中,共用体不能直接通过初始化列表来初始化,但可以在声明变量后直接赋值给某个成员。需要注意的是,由于共用体的所有成员共享同一块内存,因此赋给一个成员的值会覆盖掉之前赋给其他成员的值。

访问共用体的成员与访问结构体的成员类似,都是使用点操作符.(如果共用体变量是结构体成员或指针,则使用箭头操作符->)。

四、共用体的使用场景

共用体在C语言中有一些特定的使用场景:

1.节省内存:当你知道某个变量在程序的不同阶段只会使用不同的类型之一时,可以使用共用体来节省内存。例如,你可以使用一个共用体来存储一个值,该值在程序的不同部分可能是整数、浮点数或字符串。

2.处理不同类型的数据:在某些情况下,你可能需要处理多种类型的数据,但你知道这些数据在任意时刻只会有一种类型。这时可以使用共用体来存储这些数据。

3.与硬件交互:在处理底层硬件或与特定硬件交互时,共用体可能会很有用。例如,某些硬件寄存器可能具有不同的解释方式(例如,作为整数或位字段),可以使用共用体来表示这些寄存器。

五、共用体编程示例

下面是一个简单的编程示例,演示了如何定义和使用共用体:

#include <stdio.h> 
#include <string.h> 
union MyUnion { 
int i; 
float f; 
char str[20]; 
}; 
int main() { 
union MyUnion data; 
// 给整型成员赋值 
data.i = 123; 
printf("Integer value: %d\n", data.i); 
// 给浮点型成员赋值(覆盖之前的整型值) 
data.f = 456.78f; 
printf("Float value: %.2f\n", data.f); 
// 给字符数组成员赋值(覆盖之前的浮点型值) 
strcpy(data.str, "Hello, World!"); 
printf("String value: %s\n", data.str); 
// 注意:此时访问整型或浮点型成员将不会得到之前赋的值 
// 因为它们已经被字符数组的值覆盖 
// 尝试访问整型成员(将得到未定义的值) 
printf("Integer value after string assignment: %d\n", data.i); // 输出可能是垃圾值 
return 0; 
}

在这个示例中,我们定义了一个名为MyUnion的共用体,并在main函数中创建了一个MyUnion类型的变量data。然后,我们分别给data的整型、浮点型和字符数组成员赋值,并打印出它们的值。注意,在给字符数组成员赋值后,再访问整型或浮点型成员将不会得到之前赋的值,因为它们已经被字符数组的值覆盖。

相关文章
|
人工智能 机器人 测试技术
使用LM Studio在本地运行LLM完整教程
GPT-4被普遍认为是最好的生成式AI聊天机器人,但开源模型一直在变得越来越好,并且通过微调在某些特定领域是可以超过GPT4的。
6579 1
|
Linux
Linux Centos7 下升级openssh1.1.1u版本
Linux Centos7 下升级openssh1.1.1u版本
963 0
|
供应链 安全 Shell
供应链投毒预警 | 开源供应链投毒 202401 最新月报来啦!
悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库,结合程序动静态分析方法对潜在风险的开源组件包进行分析和监测,捕获大量开源组件恶意包投毒攻击事件。2024 年 1 月份,悬镜供应链安全情报中心在 Npm 官方仓库(https://www.npmjs.com/)和 Pypi 官方仓库(https://pypi.org/)上共捕获 675 个不同版本的恶意投毒包,其中 Npm 仓库投毒占比 90.48%, Pypi 仓库投毒占比 9.52%, 从每日捕获的投毒包数据来看,Npm 仓库仍然是开源组件投毒的重灾区。
478 1
|
网络协议 网络安全
openWRT软路由AdGuardHome 未运行 未重定向无法更新核心解决办法
openWRT软路由AdGuardHome 未运行 未重定向无法更新核心解决办法
15033 0
|
安全 编译器 C语言
【C语言】typeof 关键字详解
`typeof` 关键字在GCC中用于获取表达式的类型,便于动态类型定义和宏编程。它可以用于简化代码、提高代码的灵活性和可维护性。虽然 `typeof` 是 GCC 扩展,并非标准C的一部分,但它在实际编程中非常有用。
617 1
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
2227 4
|
运维 数据可视化 数据处理
实时计算Flink场景实践和核心功能体验 评测
实时计算Flink场景实践和核心功能体验 评测
383 5
|
存储 C语言
操作多级(一、二、三级)指针才是我们的该有的姿态~
本文通过一道C语言编程题目,详细解析了多级指针的加减操作,包括二级指针和三级指针的使用,以及如何理解指针的地址计算过程,帮助读者巩固和理解指针概念。
289 0
|
存储 编解码 算法
声音的变奏:深入理解ffmpeg音频格式转换的奥秘与应用(一)
声音的变奏:深入理解ffmpeg音频格式转换的奥秘与应用
642 0
CMake的拷贝文件到指定目录——CMake三板斧
CMake的拷贝文件到指定目录——CMake三板斧
2066 0