结构体变量的创建和初始化以及内存对齐

news2024/11/18 17:20:43

在这里插入图片描述

前言

嗨,我是firdawn,在本章中我们将介绍,结构体变量的创建和初始化,结构成员访问操作符以及结构体的内存对齐,下面是本章的思维导图,接下来,让我们开始今天的学习吧!
在这里插入图片描述

一,结构体类型的声明

1.1 结构体的一般声明

在这里插入图片描述
这里声明的结构体是有名字(Stu)的。

1.2 结构体的特殊声明

在结构体的声明中,有一类特殊的声明为匿名声明,如下图
在这里插入图片描述
这里就可以懒得起名字了,对不对,不过匿名声明有很多缺点,例如:
1.匿名结构体只能使用一次,只能在声明这个结构体的同时创建结构体变量。
2.如下图
在这里插入图片描述
在这里编译器会将两个结构体当成不同的类型,所以这样赋值是非法的。
总结:那么,既然匿名声明有诸多麻烦,编者建议大家尽量少使用匿名声明。

1.3 结构体的自引用

我们在定义结构体时,如果要在结构体成员中包含⼀个类型为该结构本⾝的成员,应该怎么做呢?如图(错误示范),
在这里插入图片描述
在结构体 U 中,成员struct U展开又会包含自己,这样无限循环下去,这个结构体就会无限大。
所以,这样自引用是不行的,那我们应该怎么做呢,才能在结构体中又包含⼀个类型为该结构本⾝的成员,正确答案如下图,其实我们使用指针就可以了。
在这里插入图片描述

二,结构体变量的创建和初始化

2.1 结构体变量的创建

结构体变量的创建有两种方式:
1.在声明结构体的同时创建结构体变量
在这里插入图片描述
2.在使用时,用结构体类型创建结构体变量
在这里插入图片描述

2.2 结构体变量的初始化

在这里插入图片描述

三,结构成员访问操作符

3.1 结构体成员访问操作符有两种,用于访问结构体成员:. 和 ->

  1. 对于结构成员访问操作符 “ . ”,它的操作对象是结构体成员
    在这里插入图片描述

  2. 对于结构成员访问操作符 “ -> ”,它的操作对象是结构体指针
    在这里插入图片描述

四,结构体传参

4.1 传结构体变量

在这里插入图片描述
在这里,调用函数时,传的是变量,为值传递,形参是实参的一份临时拷贝,改变形参不影响实参。

4.2 传结构体地址

在这里插入图片描述

在这里,调用函数时,传的是地址,为址传递,我们可以通过解引用操作来改变结构体变量stu1。

五,结构体内存对齐

5.1 对齐规则

  1. 结构体的第一个成员的起始地址处,默认为偏移量为0的位置,每过一个字节,偏移量加一。
  2. 结构体的每一个成员都需要对齐到成员对齐数的整数倍的偏移量位置处。
    对齐数=成员所占的字节大小与编译器默认的最大对齐数之间的较小值。
  3. 结构体的总大小必须是其内部成员中的最大对齐数的整数倍。
    在这里插入图片描述
    不放数据的空间我用了灰色填充。

5.2 为什么存在内存对齐?

  1. 平台移植原因,某些平台,只能在特定的地址处,取出特定的数据。
  2. 性能原因,如果编译器处理数据时,一次读取8个字节,那么我们储存一个8字节的数据,如果采用了内存对齐规则,编译器只读取一次就可以拿到数据,否则我可能需要读取两次才能拿到数据。。总的来说,这是一种拿空间换时间的做法。
  3. 我们既然已经知道的内存对齐,那么,如果我要尽量减小空间消耗,应该怎么做呢?其实,我们这时候可以尽量将相同数据类型的成员放到一起,这样,就可以节省空间啦。

5.3 修改默认对齐数

我们可以通过使用预处理指令#pragma pack(4),修改最大对齐数为4。

六,结构体实现位段

6.1 什么是位段

位段的声明和结构体是类似的,不过有两个地方不同。

  1. 位段的成员必须是int unsigned int 或者 signed int,不过在C99标准中,位段成员可以上其他的类型。
  2. 位段的成员名后面有一个冒号和一个数字。

6.2 位段的内存分配

位段存储时,编译器分配空间是一个字节一个字节给的,使用空间的时候,一个位段成员所占空间的大小(单位是bit)取决于你定义它时指定给它的空间大小。不过空间是从左向右使用还是从右向左使用,标准是未定义的,取决于具体的编译器,在VS2022中,位段成员的空间使用是从右向左的。

6.3 位段的跨平台问题

  1. int 位段被当成有符号数还是⽆符号数是不确定的。
  2. 位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会
    出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义。
  4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利⽤,这是不确定的。不过在VS2022中是舍弃这块空间。

6.4 位段的应用

由于位段能节省空间的优点,位段可以用于IP数据报的传递,这样就可以减小网络的延迟。
在这里插入图片描述

6.5 位段使用的注意事项

位段的几个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。
所以不能对位段的成员使用&操作符,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是输⼊放在⼀个变量中,然后赋值给位段的成员。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:图书管理系统

目录 一.book 1.在book包中的Book 类用来定义和引用书的名字,作者,价格,类型等。 2.在book包中的第二个类是BookList是用来构建书架,和书架上的初始书本, 二、ioperations 1.AddOperation (增加图书) 2.BorrowOp…

若依 Ruoyi-Vue PageHelper 分页失效 total为记录数

分页插件PageHelper返回记录总数total竟然出错了 执行控制台的SQL,查询出来的total数量是对的,很奇怪分页的total设置为查询到的记录数。 怀疑对list.stream操作,影响了分页,代码发现确实是这样,debug,居然…

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法

电脑丢失amtlib.dll文件是什么情况?出现amtlib.dll打不开怎么办?这样的情况有什么解决方法呢?今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法?一起来看看amtlib.dll文件丢失会有哪些方法修复? a…

Unity3D雨雪粒子特效(Particle System)

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下雨的特效1-1.首先就是创建一个自带的粒子系统,整几张贴图,设置一下就能实现想要的效果了1-2 接着往下看视频效果 👉二、下雪的特效👉三、下雪有积雪的效果3-1 先把控…

IDEA项目通过 tomcat运行报错: 404 请求的资源不可用

SpringBootVue项目 IDEA运行 Tomcat,自动打开网页报错 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/WarehouseManagerApi_war/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.89 但是运行访问 …

【Linux】Centos7.6忘记root密码重置

一、重启linux按e进入到编辑模式 二、在“ro”这行末尾加上init/bin/sh 三、按Ctrlx进入到单用户模式 #系统启动后,根文件系统会处于只读模式。要将其重新挂载为读写模式 mount -o remount,rw / #修改root密码 passwd root #确保 SELinux 在下一次启动时重新标记文…

自用网站合集

总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m,别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…

Flask-SQLAlchemy的使用【二】

目录 一.查询 1.1查询语句的格式 1.2查询过滤器 1.3查询执行器 1.4具体例子 1.4.1查询有多少个用户 1.4.2查询第一个用户 1.4.3查询id为4的用户 1.4.4查询id为4title为4的记录 1.4.5查询id为4或者title为4的记录 1.4.6查询id为[1,3,5,7,9]的记录 1.4.7查询所有记录&a…

java面试(JVM)

JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行自动内存管理,垃圾回收机制 JVM由哪些部分组成,运行流程是什么 什么是程序计数器 程序计数器…

ABB机器人---基础编程

目录 第一章 代码解释 1.1 基础代码 1.1.2 关于 VAR robtarget pos 1.1.3 关于四元数 1.2 机器人初始化程序 1.3 配置通信 (ProfiNet 示例,ABB RAPID) 1.4 设置干涉区 (ABB RAPID) 1.5 示教轨迹和自动过程 (ABB RAPID) 1.6 配置抓手并进行抓取操作 (ABB RA…

Linux: network: TCP: zero window size/window full 示例

最近遇到一个问题,当前机器的CPU使用率非常高,然后导致其中一个程序处理socket的数据过慢,然后出现下面的zero的示例。 下面是在接收buff用光的时候,发出的 TCP zeroWindows的消息 这种问题就是内存,CPU,网速之间的性能取舍。具体解决的话,需要看具体的需要是什么样的?…

他用AI,抄袭了我的AI作品

《大话西游》里面有一句经典台词:每个人都有一个妈,但是“你妈就一定是你妈吗?” 用AI创作的艺术作品,也走进类似的困境:如何证明你用AI生成的作品,就是你的作品? 近日,腾讯科技独…

三星固态硬盘870evo与qvo的区别

三星固态硬盘870evo与qvo的区别 三星固态硬盘870 EVO和QVO的区别主要有以下几点: 1闪存颗粒不同:三星固态QVO采用的是QLLC闪存颗粒,而三星固态870 EVO则是TLC闪存颗粒。 2传输速度不同:三星固态QVO传输速度比较低,而三…

电路仿真软件:点亮教学新篇章,十大便利助力高效学习

在信息化时代的浪潮中,电路仿真软件以其独特的优势,逐渐在教学领域崭露头角。它不仅能够帮助学生更好地理解电路知识,还能提升教师的教学效果。接下来,让我们一起探讨电路仿真软件对教学带来的十大便利。 一、直观展示电路原理 电…

Unity | 框架MVC

目录 一、MVC介绍 二、搭建UI界面 三、代码实现 1.Model层 2.View层 3.Controller层 四、MVC框架测试 五、知识补充 一、MVC介绍 model:数据层。界面展示的数据(需要进行初始化、更新、保存、事件通知等操作),单例模式&am…

【全开源】沃德商协会管理系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的商协会系统,新一代数字化商协会运营管理系统,以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点,实施功能全场景覆盖,一站式解决商协会需求壁垒,有效快速建立…

公司废弃的2014年群晖 DS215J 被我打包回家了,试玩一下

文章目录 简介安装查看存储、cpu、内存等信息DMS 学习video station 简介 群晖DS215J https://www.datastoreworks.com/DS215j.asp 下载:chrome-extension://oemmndcbldboiebfnladdacbdfmadadm/https://global.download.synology.com/download/Document/Hardware/…

ATmega328P加硬件看门狗MAX824L看门狗

void Reversewdt(){ //硬件喂狗,11PIN接MAX824L芯片WDIif (digitalRead(11) HIGH) {digitalWrite(11, LOW); //低电平} else {digitalWrite(11, HIGH); //高电平 }loop增加喂狗调用 void loop() { …… Reversewdt();//喂狗 }

Superset,基于浏览器的开源BI工具

BI工具是数据分析的得力武器,目前市场上有很多BI软件,众所周知的有Tableau、PowerBI、Qlikview、帆软等,其中大部分是收费软件或者部分功能收费。这些工具一通百通,用好一个就够了,重要的是分析思维。 我一直用的Tabl…