C语言之联合体

 与结构体一样,联合体也是由多个成员组成,但是编译器只为最大的成员分配足够的空间,联合体的所有成员共用一块空间,所以联合体也叫共用体。

1.声明:类似结构体的声明,只是名字是union不是struct。声明并计算一下大小和打印地址:

union Un
{char c;int i;
};int main()
{union Un u = { 0 };printf("%zd\n", sizeof(u));printf("%p\n", &u);printf("%p\n", &(u.c));printf("%p\n", &(u.i));return 0;
}

由此也可以知道联合体内部成员共用一块地址,也就是说它们叠在了一起,所以同一时间只能使用一个成员,改了c的值i也会改,改了i的值c也会改。

2.大小:但其实联合体的总大小也得是最大成员对齐数的整数倍,就比如:

union Un
{char c[5];int i;
};int main()
{union Un u = { 0 };printf("%zd\n", sizeof(u));return 0;
}

char类型是一个字节,与vs的默认对齐数相比较小,int类型是4个字节,所以最大的对齐数是4,由于联合体需要给最大的成员足够的内存空间,此时这个最大成员是char c[5],所以先给5个字节,然后还要是4的整数倍,所以就是8了。 

3.联合体的应用:

现有一个活动,要上线一个礼品兑换单,礼品兑换单有三种商品:图书、杯子、衬衫。

每一种商品都有:库存量、价格、商品类型和与商品类型相关的其他信息:

图书:书名、作者、页数

杯子:设计

衬衫:设计、可选颜色、可选尺寸

分类一下,每种商品都有的属性叫做公共属性,自己特有的叫特殊属性。如果把上述属性全部设计成一个结构体的话,空间会偏大,而且所有的属性不会同时出现,有一些特殊属性就会使用不到,造成空间的浪费,这时候可以配合联合体来设计。

struct gift_list
{int stock_number;//库存量double price;//定价int item_type;//商品类型union {struct{char title[20];//书名char author[20];//作者int num_pages;//页数}book;struct{char design[30];//设计}mug;struct{char design[30];//设计int colors;//颜色int sizes;//尺寸}shirt;}item;
};

把特殊属性用联合体包括起来,可以在一定程度上节省空间。

以上就是本节的全部内容了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql结构与sql执行流程

Mysql的大体结构 客户端:用于链接mysql的软件 连接池: sql接口: 查询解析器: MySQL连接层 连接层: 应用程序通过接口(如odbc,jdbc)来连接mysql,最先连接处理的是连接层。 连接层…

linux学习:awk和RE

awk awk是一种用于处理文本的编程语言工具,他扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤。如果找 不到匹配内容,则继续处理下一行 awk ‘条件 1 {动作 1} 条件…

Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

原文链接:https://arxiv.org/abs/1908.10084 提出契机: 提升相似文本的检索速度 在自然语言处理领域,BERT(Bidirectional Encoder Representations from Transformers)和RoBERTa(A Robustly Optimized B…

网络安全之代码签名证书申请

代码签名,作为一种数字安全机制,对于软件开发、分发及用户使用环节具有至关重要的意义。以下从六大方面阐述代码签名必不可少的重要性: 确保代码来源可信: 代码签名如同软件的“身份证”,通过数字证书对开发者身份进…

CVE-2024-3148 DedeCms makehtml_archives_action sql注入漏洞分析

DedeCMS(也称为织梦CMS)是一款基于PHPMySQL的开源内容管理系统。 在 DedeCMS 5.7.112 中发现一个被归类为严重的漏洞。此漏洞会影响某些未知文件dede/makehtml_archives_action.php的处理。操作导致 sql 注入。攻击可能是远程发起的。该漏洞已向公众披露…

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议,即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的,旨在解决传统HTTP协议在实…

【Frida】【Android】 10_爬虫之WebSocket协议分析

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

【C#】yield使用

&#x1f4bb;代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace ConsoleApp15 {internal class Program{static void Main(string[] args){IEnumerable<int&…

【微服务】面试题(一)

最近进行了一些面试&#xff0c;这几个问题分享给大家 一、分别介绍一下微服务、分布式以及两者的区别 微服务&#xff08;Microservices&#xff09;和分布式系统&#xff08;Distributed Systems&#xff09;是两种不同的软件架构风格&#xff0c;虽然它们之间有些重叠&#…

uniapp极光推送、java服务端集成

一、准备工作 1、进入【服务中心】-【开发者平台】 2、【创建应用】&#xff0c;填写应用名称和图标&#xff08;填写项目名称&#xff0c;项目logo就行&#xff0c;也可填写其他的&#xff09; 3、选择【消息推送】服务&#xff0c;点击下一步 ​ ​ Demo测试 参照文档&…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

css伪类:last-child或:first-child不生效

目录 一、问题 二、原因及解决方法 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.想使用伪类:last-child给 for循环出来的最后一个元素单独添加样式。但是发现无论怎么写都没有添加上去。 2.真是奇怪呀&#xff0c;明明写的没有问题呀&a…