64.【C语言】再议结构体(下)(未完)

本文衔接第63篇

目录

6.复习

7.修改默认对齐数

8.结构体传参

01.传递非指针参数

02.传递指针参数(传递地址)

03.对比

9.结构体实现位段

01.位段的定义

02.格式

03.例题

答案速查

分析

前置知识:位段的内存分配

解析

若按浪费空间处理

验证


6.复习

20.【C语言】初识结构体(重要)

48.【C语言】结构体补充

63.【C语言】再议结构体(上)

7.修改默认对齐数

加一条预处理指令

#pragma pack(对齐数)
struct 结构体标签{成员列表;}变量列表(全局变量);//变量列表可以不写,但;必须有!!!

 在#pragma pack(对齐数)后紧跟着结构体就能指定该结构体的对齐数

建议给1,2的次方数:2,4,8

#include <stdio.h>
#pragma pack(1)
struct s1
{char a;char b;int c;
};
#pragma pack()//恢复默认对齐数int main()
{printf("%zd", sizeof(struct s1));return 0;
}

打印结果为6

8.结构体传参

01.传递非指针参数

#include <stdio.h>
struct s
{int data[1000];int num;
};void sim_print(struct s ss)//结构体传参
{int i = 0; for (i = 0; i < 5; i++){printf("%d ",ss.data[i]);}printf("\nnum = %d\n", ss.num);
}int main()
{struct s s = { { 1, 2, 3, 4, 5 } , 100 }; sim_print(s);return 0;
}

 649fedba905547ce98c30e0799df9aa3.png

f592253b4fb1450b9a35f9439c373d9e.png

02.传递指针参数(传递地址)

#include <stdio.h>
struct s
{int data[1000];int num;
};//结构体传参,*ps表明传递的是指针
void sim_print(struct s *ps)
{int i = 0; for (i = 0; i < 5; i++){printf("%d ",ps->data[i]);}printf("\nnum = %d\n", ps->num);
}int main()
{struct s s = { { 1, 2, 3, 4, 5 } , 100 }; sim_print(&s);//传的是地址return 0;
}

注:结构体成员变量->成员名是结构体特有的写法

03.对比

当结构体成员变量占用较大的内存时, 因为参数要压栈,所以传递指针参数比传递非指针参数要节省空间,传递指针参数不会另外开辟额外的空间

9.结构体实现位段

01.位段的定义

摘自百度百科:

C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”(bit field),利用位段能够用较少的位数存储数据

02.格式

类型 成员变量:数字;

如: int a:5;

03.例题

求下列代码的执行后位段在内存中的数据(在VS2022中测试)

struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};int main()
{struct S s = { 0 };//注意区分大小写s.a = 10;s.b = 12;s.c = 3;s.d = 4;return 0;
}

答案速查

位段在内存中的数据:62 03 04

分析

因为 以位为单位来指定其成员所占内存长度

前置知识:位段的内存分配

2条规则,1条提醒

1.位段的成员可以是int,unsigned int,signed int,char等类型

2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的

提醒:位段涉及很多不确定因素,位段不跨平台,注重可移植的程序应该避免使用位段(本文后面会单独讲)

 

位段的内存分配

1.数据的存储顺序由是编译器而定(C标准没有规定)

2.每次向CPU申请1byte,如果不够则继续申请1byte

3.是否浪费空间取决于编译器(C标准没有规定)

解析

未存储数据时:

8b54a2c5b70741d3a0b31291363bed7c.png

分类讨论:

若按浪费空间处理

由低地址向高地址存储,设数据的二进制的存储顺序为从右向左(VS2022满足此情况)

十进制10==二进制1010 十进制12==二进制1100 十进制3==二进制11 十进制4==二进制100

    char a : 3;-->a占3位,1010会被截断为3位010存储
    char b : 4;-->b占4位,恰好可以存储1100
    char c : 5;-->c占5位,11占2位,因此补前导零存储为00011
    char d : 4;-->d占4位,100占3位,因此补前导零存储为0100

bca644ba52134c04bde9d4f35623ab84.png

 按十六进制拆分:0110 0010 0000 0011 0000 0100-->62 03 04

位段的空间以4个字节(int)或者1个字节(char)的方式来开辟的,a,b,c,d的类型全为char,因此不用改动为62 03 04 00

验证

VS2022+x64+debug环境下,VS2022调试,F11逐语句

打开内存窗口,输入&s(小写的s)

1c00e7ec857d4297977fbc51bd1b0aa2.pngde85388a6fd34fba86f07a8793c38583.png

b340dfd98b364e48a8e49e951e5cce55.png

03d67f85d9544c539904305d7925596c.png

176711e990a04735b45453832a1434b8.png

 

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

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

相关文章

①三菱Modbus主站MELSEC转ModbusRTU/ASCII工业MELSEC网关串口服务

三菱Modbus主站MELSEC转ModbusRTU/ASCII工业MELSEC网关串口服务https://item.taobao.com/item.htm?ftt&id834634632647 MELSEC 通信单元 MELSEC 转 RS485 MS-A1-80X1 系列概述 型号&#xff1a;1路总线MELSEC网关(单网口&#xff09; MS-A1-8011 1路总线MELSEC网关(双…

A Learning-Based Approach to Static Program Slicing —— 论文笔记

A Learning-Based Approach to Static Program Slicing OOPLSA’2024 文章目录 A Learning-Based Approach to Static Program Slicing1. Abstract2. Motivation(1) 为什么需要能处理不完整代码(2) 现有方法局限性(3) 验证局限性: 初步实验研究实验设计何为不完整代码实验结果…

计算机网络基础--认识协议

目录 前言 一、IP地址与端口 二、网络协议 1.网络体系结构框架 2.网络字节序 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 计算机网络涉及非常广泛&#xff0c;这篇文章主要对计算机网络有个认识 提示&#xff1a;以下是本篇文章正文内容&#x…

C++系列-继承

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 继承的概念和定义 继承是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行拓展&#xff0c;增加功能&#xff0c;这样可以…

【PyTorch】生成对抗网络

生成对抗网络是什么 Generative Adversarial Nets&#xff0c;简称GAN GAN&#xff1a;生成对抗网络 —— 一种可以生成特定分布数据的模型 《Recent Progress on Generative Adversarial Networks (GANs): A Survey》 《How Generative Adversarial Networks and Its Varian…

基于Megatron-LM从0到1完成GPT2模型预训练、模型评估及推理

随着 ChatGPT 迅速爆火&#xff0c;引领基于Transformer架构的大模型从幕后走到台前。但 ChatGPT 的成功并不是一蹴而就&#xff0c;而是&#xff0c;经过了从早期的 GPT1 到 GPT2&#xff0c;之后到 GPT3 和 InstructGPT、然后到GPT3.5和ChatGPT&#xff0c;直到如今的多模态大…

一钉多用:自攻螺钉在家居与工业领域的广泛应用

自攻螺钉的结构要素有哪些重要特点&#xff1f; 自攻螺钉适用于非金属或软金属&#xff0c;不需要配合预先开好的孔和攻牙。自攻螺钉的尖头设计使其能够“自我攻入”材料中&#xff1b;而普通螺丝通常是平头&#xff0c;规格一致。自攻螺钉的关键在于&#xff0c;打孔时不需要进…

【JavaEE初阶】网络原理

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 ⽹络互连 IP地址 端口号 协议 协议分层 优势 TCP/IP 五层网络模型 数据在网络通信中的整体流程 封装和分用 封装 分用 ⽹络互连 随着时代的发展&#xff0c;越来越需…

Angular基础学习(入门 --> 入坑)

目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 &#xff08;ViewChild&#xff09; 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器&#xff08;电位器模拟&#xff09;采集光照信息 3、可…

X86架构(九)——保护模式的进入

全局描述符表 全局描述符表(Global Descriptor Table,GDT)是保护模式下非常重要的一个数据结构。 在保护模式下&#xff0c;对内存的访问仍然使用段地址和偏移地址&#xff0c;在每个段能够访问之前&#xff0c;必须先行设置好 GDT 的地址&#xff0c;并加载全局描述符表寄存…

emp.dll丢失怎么解决,快来试试这个几个解决方法

在日常使用电脑玩游戏的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中最常见的就是“emp.dll丢失”。那么&#xff0c;emp.dll到底是什么&#xff1f;它为什么会丢失&#xff1f;丢失后会对我们的电脑产生什么影响&#xff1f;本文将为您详细解析emp.dll的概念…

[BUUCTF从零单排] Web方向 03.Web入门篇之sql注入-1(手工注入详解)

这是作者新开的一个专栏《BUUCTF从零单排》&#xff0c;旨在从零学习CTF知识&#xff0c;方便更多初学者了解各种类型的安全题目&#xff0c;后续分享一定程度会对不同类型的题目进行总结&#xff0c;并结合CTF书籍和真实案例实践&#xff0c;希望对您有所帮助。当然&#xff0…

打造高业绩朋友圈:策略与实践

在数字化时代&#xff0c;朋友圈不仅是个人生活的展示窗口&#xff0c;更是商业变现的有力平台。许多人通过精心经营朋友圈&#xff0c;实现了财富的增长&#xff0c;甚至达到了年入百万的惊人业绩。朋友圈已成为普通人实现逆袭的重要战场。 要打造一个业绩过万的朋友圈&#…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9509开发指南(兼容PCa9509)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.VCCA1.35V,VCCB5V,A1输入&#xff0c;B1输出 2.VCCA1.35V,VCCB5V,B1输入&#xff0c;A1输出 3.VCCA1.35V,VCCB5V,A2输入&#xff0c;B2输出 4.VCCA1.35V,VCCB5V,B2输入&#xff0c;A2输出

升级 Windows 后如何恢复丢失的文件

升级到 Windows 11 后可以恢复丢失的文件&#xff01;阅读帖子直到最后&#xff0c;了解如何做到这一点。 为了获得安全更新并使用最新的操作系统&#xff0c;人们会升级到最新版本的 Windows。然而&#xff0c;在这样做的过程中&#xff0c;许多人丢失了他们的重要文件&#…

基于SpringBoot+Vue+MySQL的体育商城系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。体育用品市场作为其中的一个重要分支&#xff0c;也逐渐向线上转移。基于SpringBootVueMySQL的体育商城系统应运而生&#xff0c;旨在通过构建…

优秀的拆分C++

题目&#xff1a; 样例解释&#xff1a; 样例1解释 6422221 是一个优秀的拆分。注意&#xff0c;6222 不是一个优秀的拆分&#xff0c;因为拆分成的 3 个数不满足每个数互不相同。 思路&#xff1a; 题目大致意思是说给定一个正整数NN&#xff0c;让你用二进制表示&#xff08;…

PDCA优化任务流程

这里写目录标题 一、背景二、PDCA重要性与必要性概念PDCA循环的重要性 三、PDCA分析这次任务的执行任务描述分析原因&#xff1a;结合PDCA分析&#xff1a;提高办法&#xff1a; 四、总结 一、背景 汇报任务完成情况&#xff0c;未提交实际成果。 本次总结旨在通过PDCA循环的视…

鸿蒙开发(NEXT/API 12)【硬件(振动开发1)】振动

通过最大化开放马达器件能力&#xff0c;振动器模块服务拓展了原生马达服务&#xff0c;实现了振动与交互融合设计&#xff0c;从而打造出细腻精致的一体化振动体验和差异化体验&#xff0c;提升用户交互效率、易用性以及用户体验&#xff0c;并增强品牌竞争力。 运作机制 Vi…