学习C语言(21)

news2024/9/29 7:20:13

整理今天的学习内容

1.结构体实现位段

(1)位段的声明

位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他类型

例:

(2)位段的内存分配

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

解释下面程序的运行结果

首先开辟四个字节,32个比特位,_a,_b,_c,依次放入被开辟空间中

当_d申请30个比特位的空间时,原先开辟的空间不够,再次开辟4个字节的空间存放_d,其余空间被浪费掉

                                                                                                       注:一个空格代表1个比特位

所以struct A 变量的大小是8个字节

测试:

                        注:一个空格代表1个比特位   

(3)位段的跨平台问题

·int 位段被当成有符号数还是无符号数是不确定的
·位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题
·位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义
·当⼀个结构包含两个位段,第二个位段成员比较大,无法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的
·跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在

(4)位段的使用

位段的几个成员共用同⼀个字节,所以不能对位段的成员使用&操作符,这样就不能使用scanf直接给位段的成员输入值,只能是先输入放在一个变量中,然后赋值给位段的成员

例:

自定义类型:联合和枚举

1.联合体

(1)联合体类型的声明

(2)联合体在内存中的储存

编译器只为联合体最大的成员分配足够的内存空间,联合体的特点是所有成员共用同⼀块内存空间。所以联合体也叫:共用体
给联合体其中一个成员赋值,其他成员的值也跟着变化

      

(3)联合体大小的计算

1.联合的大小至少是最大成员的大小
2. 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

(4)结构体和联合体的对比

例:图书、杯子、衬衫这三种商品每⼀种都有:库存量、价格、商品类型的信息,除此之外,图书还包括书名、作者、页数,杯子还包括设计,衬衫还包括设计、可选颜色、可选尺寸

以结构体的的形式设计变量:

以联合体的的形式设计变量:

与结构体相比,联合体的使用可以节省内存

(5)用联合体判断当前机器的大小端

2.枚举

(1)枚举的声明

{}中的内容是枚举类型的可能取值,也叫枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值

(2)枚举类型的优点

·增加代码的可读性和可维护性
· 和#define定义的标识符比较枚举有类型检查,更加严谨
·便于调试,预处理阶段会删除 #define 定义的符号
· 使用方便,一次可以定义多个常量
·枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

(3)枚举类型的使用

使用枚举常量给枚举变量赋值

C语言中可以拿整数直接给枚举变量赋值,但在C++中不行,因为C++的类型检查比较严格

动态内存管理

C语言中的动态内存开辟使程序员可以自己申请和释放空间

1.malloc和free

(1)malloc

void*  malloc  (size_t  size);

                                      ↑

                      需要开辟空间的字节数
这个函数向内存申请⼀块连续可用的空间,并返回指向这块空间的指针
• 如果开辟成功,则返回⼀个指向开辟好空间的指针
• 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查
• 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定
• 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器

(2)free

void free (void* ptr);

                          ↑

                    需要释放的动态内存的地址

free函数用来释放动态开辟的内存

• 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的

• 如果参数 ptr 是NULL指针,则函数不进行任何处理

malloc和free都声明在 stdlib.h 头文件中

使用free函数处理过的指针是野指针,需要置NULL

2.calloc和realloc

(1)calloc

void* calloc (size_t num, size_t size);

• 函数的功能是为 num 个大小为 size 的元素开辟⼀块空间,并且把空间的每个字节初始化为0

• 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全 0

calloc函数的使用:

  

(2)realloc

void* realloc (void* ptr, size_t size);

realloc 函数可以对动态开辟内存大小进行调整

• ptr 是要调整的内存地址

• size为调整之后新大小

• 返回值为调整之后的内存起始位置

 • 这个函数调整原内存空间大小的基础上,还可能会将原来内存中的数据移动到新的空间

realloc在调整内存空间时存在两种情况:

情况1:原有空间之后有足够大的空间

直接原有内存之后直接追加空间,原来空间的数据不发生变化

情况2:原有空间之后没有足够大的空间

在堆空间上另找⼀个合适大小 的连续空间来使用,这样函数返回的是⼀个新的内存地址

realloc函数的使用:

realloc(NULL,20)==malloc(20) 

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

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

相关文章

【 Java 】工具类 —— Collections 与 Arrays 的实用操作全解析

Collections工具类 在Java中,针对集合的操作非常频繁,例如对集合中的元素排序、从集合中查找某个元素等。针对这些常见操作,Java提供了一个工具类专门用来操作集合,这个类就是Collections,它位于java.util包中。Colle…

揭开量子计算和加密未来的秘密

加密保护您的数据 您是否想知道如何保证您的在线数据安全?这就是加密的作用所在。加密是一种使用秘密代码更改数据的过程。这些更改只能由拥有正确密钥的接收者解码和读取。 加密是保护敏感和个人信息安全的重要工具。使用加密的一些示例包括信用卡详细信息、消息…

嵌入式linux系统中Sysfs设备驱动管理方法

大家好,今天主要给大家分享一下,如何使用linux系统里面的Sysfs进行设备管理,希望对大家有所收获。 第一:Sysfs设备驱动管理简介 sysfs 是非持久性虚拟文件系统,它提供系统的全局视图,并通过它们的 kobiect 显示内核对象的层次结构(拓扑)。每个 kobiect 显示为目录和目录…

一次 Spring 扫描 @Component 注解修饰的类坑

问题现象 之前遇到过一个问题,在一个微服务的目录下有相同功能 jar 包的两个不同的版本,其中一个版本里面的类有 Component 注解,另外一个版本的类里面没有 Component 注解,且按照加载的顺序,没有 Component 注解的 j…

maven安装教程(图文结合,最简洁易懂)

前提 所有的Maven都需要Java环境,所以首先需要安装JDK,本教程默认已安装JDK1.8 未安装JDK可看JDK安装教程:JDK1.8安装教程 主要分为两个大步骤:安装、配置 一、下载和安装Maven 1、将maven解压后的文件夹复制到D盘根目录 (最好…

fmql之Linux内核定时器

内容依然来自于正点原子。 Linux内核时间管理 内容包括: 系统频率设置节拍率:高节拍率的优缺点全局变量jiffies绕回的概念(溢出)API函数(处理绕回) HZ为每秒的节拍数 Linux内核定时器 内容包括&#xf…

3-1.Android Fragment 之创建 Fragment

Fragment Fragment 可以视为 Activity 的一个片段,它具有自己的生命周期和接收事件的能力,它有以下特点 Fragment 依赖于 Activity,不能独立存在,Fragment 的生命周期受 Activity 的生命周期影响 Fragment 将 Activity 的 UI 和…

BUUCTF蜘蛛侠呀

解压后发现是流量包,好多icmp包 发现icmp包尾部有$$STRAT打头16进制的字符串,好多重复得。我们只需要提取尾部这些字符串是当icmp的type0时上图标识为褐色的字符串,还需要把16进制的字符串转为对应的字符串(bytes 类型&#xff09…

YOLOv8改进 | 融合篇,YOLOv8主干网络替换为MobileNetV3+CA注意机制+添加小目标检测层(全网独家首发,实现极限涨点)

原始 YOLOv8 训练结果: YOLOv8 + MobileNetV3改进后训练结果: YOLOv8 + MobileNetV3 + CA 注意机制 + 添加小目标检测层改进后训练结果(极限涨点): 摘要 小目标检测难点众多,导致很多算法对小目标的检测效果远不如大中型目标。影响算法性能的主要原因如下:第一,小目…

Windows暂停更新

目录 前言注册表设定参考 前言 不想Windows自动更新,同时不想造成Windows商店不可用,可以采用暂停更新的方案。 但是通过这里设定的时间太短了,所以我们去注册表设定。 注册表设定 win r 输入 regedit进入注册表 HKEY_LOCAL_MACHINE\SOFT…

python 02 List

Python 1-14 列表 第一课 1437. 是否所有 1 都至少相隔 k 个元素 class Solution:def kLengthApart(self, nums: List[int], k: int) -> bool:cnt k # 处理第一个 1for i, x in enumerate(nums):if x 1:if cnt < k: return Falsecnt 0 # 遇到 1 从新记数else: cnt …

解决银河麒麟V10中/data目录执行权限问题

解决银河麒麟V10中/data目录执行权限问题 1、问题描述2、解决方案步骤一&#xff1a;编辑fstab文件步骤二&#xff1a;重启系统步骤三&#xff1a;验证更改 3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟桌面操作系…

【零散技术】Odoo PDF 打印问题问题合集

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo PDF打印 是一个必备功能&#xff0c;但是总会遇到一些奇奇怪怪的问题&#xff0c;此帖仅做记录&#xff0c;方便查阅。 目录 1、样式丢失 2、部分结构丢失 3、没有中文字体 1、样式丢失 这种情况一般是由于 …

YOLOv8 Windows c++推理

#添加一个**yolov8\_。onx **和/或**yolov5\_。Onnx **模型(s)到ultralytics文件夹。 #编辑**main.cpp**来改变**projectBasePath**来匹配你的用户。#请注意&#xff0c;默认情况下&#xff0c;CMake文件将尝试导入CUDA库以与opencv dnn (cuDNN) GPU推理一起使用。 #如果你的Op…

【Power Query】三大容器及元素提取

三大容器 Table; List; Record 表 &#xff08;Table&#xff09;&#xff1a; Table一般是从外部导入的 如果非要手动生成&#xff0c;可以这样&#xff1a; #table({"学号","姓名","平时分"},{{1,"Alice",99},{2,"Beige&quo…

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,旨在帮助开发者更轻松地构建、部署和管理微服务应用。

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台&#xff0c;旨在帮助开发者更轻松地构建、部署和管理微服务应用。Nacos 提供了一系列的功能来支持服务注册与发现、配置管理、服务元数据管理、流量管理、服务健康检查等&#xff0c;是构建云原生应用和服务网…

【C++】— 类和对象(2)

文章目录 &#x1f49e;1.类的默认成员函数&#x1f49e;2.构造函数&#x1f49e;3.析构函数&#x1f49e;4.拷贝构造函数&#x1f49e;5.赋值运算符重载&#x1f49e;5.1 运算符重载&#x1f49e;5.2 赋值运算符重载 &#x1f49e;6.取地址运算符重载&#x1f49e;6.1const成员…

中国算力大会启幕,联想发布异构智算产业创新成果

9月27日&#xff0c;2024中国算力大会在河南郑州拉开帷幕。作为全球领先的算力基础设施和服务提供商&#xff0c;联想集团参会参展并携手异构智算产业联盟承办2024异构智算产业生态联盟技术论坛。 据「TMT星球」了解&#xff0c;论坛发布了新一代AI服务器、AI应用部署解决方案…

如何用AI完成毕业论文

一、利用 AI 辅助资料收集 AI 可以帮助你快速搜索大量与毕业论文相关的资料&#xff0c;节省时间和精力。 writehelp智能写作辅导&#xff1a;http://www.writehelp.vip/?sid17&#xff0c;限时免费提供开题报告、任务书和答辩PPT。 二、借助 AI 生成提纲 它能根据你的研究主…