存储类别、链接与内存管理(三)
1、malloc函数详解
(1)函数声明
#include <stdlib.h>
void* malloc(size_t size);
- malloc可以申请一定数量的空闲内存,这样的内存是匿名的,也就是malloc不会为其赋名,但是确实返回动态分配内存块的首元素地址,因此可以把该地址赋给一个指针变量,利用这个指针访问这块内存
- malloc通常返回一个char类型的指针,因为char表示一个字节。然而从ANSI C标准开始,C使用一个新的类型void*,即一个指向void的指针,相当于一个“通用指针”,由此malloc可以返回多个类型的指针。所以通常malloc的返回值都会强制转化为匹配的类型
- 把指向void的指针赋给任意类型的指针完全不需要考虑类型匹配的问题
- 如果malloc分配内存失败就会返回空指针
(2)使用函数
①使用malloc创建一个数组
double* ptd;
ptd = (double*)malloc(30 * sizeof(double));
if(ptd == NULL)//有可能不会分配到内存
{printf("Nunber not correctly entered -- bye");exit(EXIT_FAILURE);//程序异常终止程序
}
//某些使用ptd的程序
free(ptd);//用完后释放申请的空间,将内存还给计算机
ptd = NULL;//并且将还记住地址ptd指针置空
②使用注意事项
- 如果让ptd指向这块内存的首元素,便可以使用数组名一样使用它,也就是说可以使用ptd[0]、ptd[1]等指针用法
- ptd指向的是一个double类型的指针,而不是整个30个double类型的块
- 在C中不一定使用强制转化类型,但是在C++中必须使用,在C中使用强制类型转换更加容易把C程序转化为C++
- 最后两步是为了避免内存泄露的问题(后面会提到)
③三种创建数组的方式
- 声明数组,直接用常量表达式表达数组的维度,用数组名访问数组的元素,可以用静态内存或自动内存创建这种数组
- 声明变长数组(C99新增特性),用变量表达式表达数组的维度,具有这种特性的数组只能在自动内存中存储
- 声明一个指针,调用malloc函数,将其返回值赋给指针,使用这个指针访问数组的元素,该指针可以是静态的或自动的
2、free函数详解
(1)函数声明
#include <stdlib.h>
void free(void *ptr);
- free通常都会搭配malloc使用,free的参数是之前mlloc返回的地址,该函数释放之前malloc分配的一块内存。不能使用free释放其他方式(例如声明一个数组后使用free)
- 这样配套使用的话,malloc分配内存,free释放内存,可以重复利用一块内存空间(内存池)
(2)使用函数
double* ptd;
ptd = (double*)malloc(30 * sizeof(double));
free(ptd);
ptd = NULL;
3、exit函数详解
(1)函数声明
#include <stdlib.h>
void exit(int status);
- 如果malloc函数分配内存失败,可以调用函数exit结束程序
- status是返回给父进程的状态值。标准提供了两个返回值(被定义在stdlib.h中)保证在所有的操作系统中都能正常工作,一些操作系统还会接受一些表示其他运行错误的整数值
- EXIT_FAILURE表示程序异常终止
- EXIT_SUCCESS(相当于0)表示普通的程序结束
(2)使用函数
int sum = 0;
if(scanf("%d", &sum) != 1)
{printf("Nunber not correctly entered -- bye");exit(EXIT_FAILURE);
}
4、内存泄露的危害
void function(int n)
{double* temp = (double*)malloc(n * sizeof(double));/*假设忘记使用函数free()*/
}
int main()
{for(inţ i = 0; i < 1000000)function(1000000);
}
如果没有使用free函数将malloc申请的内存释放的话1000000*1000000就有可能将所有内存耗尽,这类问题就被称为内存泄露,在函数末尾调用free函数可以避免这类问题。
5、动态内存分配和变长数组的区别
- 动态内存分配malloc和变长数组(VLA)在功能上有点重合,比如两者都可以用于创建在运行时才确定大小的数组
- 不同的是,变长数组是自动存储类型。因此程序在离开变长数组定义的块的时候,变长数组占有的空间会被自动释放,不必使用free函数
- 另外一方面,free所用的指针变量可以与malloc函数的指针变量不同,但是两个指针必须存储相同的地址,并且不能释放两次
- 对多维数组来说,使用VLA在语法上更加的方便,使用malloc就会显得复杂得多
int n = 5, m = 6;int ar2[n][m];//变长数组(要求支持VLA)int (* p2)[6];//指向一个6元素数组的指针,使用变量p2存储
int (* p3)[m];//指向一个m元素数组的指针,使用变量p3存储(要求支持VLA)
p2 = (int (*)[6])malloc(n * 6 * sizeof(int));//n*6数组
p3 = (int (*)[m])malloc(n * m * sizeof(int));//n*m数组(要求支持VLA)
6、存储类别和动态内存分配
(1)简单分类内存
可以简单认为程序把它可用的内存分为3部分:
- 供给具有外部链接、内部链接和无连接的静态变量使用
- 供给自动变量使用
- 供给动态内存分配使用(内存堆/堆/自由内存)
(2)三类内存的细节
- 静态存储类别的变量,使用的内存数量在编译的时候就确定,只要程序还在运行,就可以访问存储在该部分的数据。该类别的变量在程序开始执行时就被创建,在程序结束的时候被销毁
- 自动存储类别的变量,在程序进入变量定义的块时存在,程序离开块的时候消失。因此,随着程序调用函数和函数结束,自动变量所用的内存数量也在相应的增加或减少。这部分的内存通常作为栈来处理,这意味着新创建的变量按顺序加入内存,然后以相反的顺序销毁
- 动态分配的内存,在调用malloc函数或相关函数的时候存在,在调用free函数后释放,这一部分的内容由程序员管理,而不是某套规则。另外,未使用的内存块分散在已使用的内存块之间,使用动态内存通常比使用栈内存慢
相关文章:
存储类别、链接与内存管理(三)
1、malloc函数详解 (1)函数声明 #include <stdlib.h> void* malloc(size_t size);malloc可以申请一定数量的空闲内存,这样的内存是匿名的,也就是malloc不会为其赋名,但是确实返回动态分配内存块的首元素地址&a…...
Java:Linux(CentOS)安装、配置及相关命令
目录一、VMware安装二、CentOS安装1、安装过程2、加载ISO2.1 桌面的设置三、VI/VIM编辑器1、一般模式2、编辑模式3、命令模式4、模式间转换四、网络配置和系统管理操作1、配置子网IP和网关2、配置虚拟机ip地址2.1 ifconfig 查询ip地址2.2 修改IP地址3、配置主机名3.1 hostname …...
Linux 操作系统原理 — 多任务优先级调度策略
目录 文章目录 目录多任务优先级调度策略User Process 调度策略配置调整 User Process 的优先级调整非实时进程的优先级调整实时进程优先级调整 User Process 的调度算法多任务优先级调度策略 在 Linux Kernel 中,Kernel Thread 作为唯一的调度实体,Kernel Scheduler(调度程…...
链表学习之找到两个链表相交的第一个节点
链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 找到两个链表相交的第一个节点 给定两个链表,这两个链表可能有环,可能无环。判断这两个链表是否相交,相交则返回第一…...
【Kubernetes】【十一】Pod详解 Pod的生命周期
Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程: pod创建过程 运行初始化容器(init container)过程 运行主容器(main container) 容器启动后钩子&#…...
Connext DDS录制服务 Recording Service(1)
1 序言 1.1 简介 RTI记录服务包括以下工具: •记录服务,一种RTI Connext DDS应用程序,用于记录主题和发现数据。记录服务记录数据更新以及时间戳,因此您可以查看或回放系统中随时间发生的数据更新。默认情况下,记录的数据存储在SQLite文件中。录制服务还具有一个API,用于…...
vTESTstudio - VT System CAPL Functions - VT2004(续2)
不要沮丧,不必惊慌,做努力爬的蜗牛或坚持飞的笨鸟,我们试着长大,一路跌跌撞撞,哪怕遍体鳞伤。vtsSetPWMVoltageLow - 设置PWM输出上的低电压功能:指定数字输出信号(尤其是PWM信号)输…...
每天一个linux命令---awk
awk命令 1. 简介 awk是一种处理文本文件的语言,是一个强大的文本分析工具,grep、sed、awk并称为shell中文本处理的三剑客。 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&am…...
Open3D 点云旋转之轴角式(Python版本)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 三维空间中表示旋转的方法有很多种,轴角式是其中非常经典的一种表示方式。虽然欧拉角表示旋转的方法很是常用,但欧拉角存在着万向锁这个问题,因此轴角式旋转在旋转使用中更为合适。其原理也很是明了,如下所述:…...
Error: Timeout trying to fetch resolutions from npm
文章目录问题描述【最终解决】我搜索到的解决方案npmjs 该依赖各版本列表及对应的被下载次数github issue 说降级到0.0.3就可以正常运行了SOF 也说降级别到0.0.3问题描述 在项目里用到了 "preinstall": "npx npm-force-resolutions"配置,在一台…...
Python基础3
目录 1. 函数多返回值 2. 函数多种传参方式 3. 匿名函数 3.1 函数作为参数传递 3.2 lambda匿名函数 4. 文件的读取操作 4.1 open()打开函数 4.2 读操作方法 4.3 文件的写入 4.4 文件的追加 5. 异常的捕获方法 5.1 捕获常规异常 5.2 捕获指定…...
高可用集群(HAC)
1、高可用集群keepalive说明 高可用定义: 目的:尽可能的提高服务的可用性 99%、99.9%、99.99%、99.999% 实现原理:心跳检测服务: 有状态: MySQL 无状态: apacheLVS Keepalive原理 案例环境专为 LVS和…...
python基于django微信小程序的适老化老人健康预警小程序
随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, 适老化老人健康预警微信小程序就是信息时代变革中的产物之一。 任何系统都要遵…...
基于微信小程序图书馆管理系统
开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis-plus本系统分微信小程序和管理后台两部分,项…...
将镭神C32激光雷达的PointXYZ数据转化为PointXYZIR格式 - 附代码
之前遇到过“镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for field “intensity“ 问题”, 当时确定了是镭神C32雷达缺少相应字段,并记录博客【学习记录】镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for fi…...
高级前端一面面试题集锦
详细说明 Event loop 众所周知 JS 是门非阻塞单线程语言,因为在最初 JS 就是为了和浏览器交互而诞生的。如果 JS 是门多线程的语言话,我们在多个线程中处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程中删除节点&#…...
Java基础 -- List集合
Java基础 -- List集合1. Introduction1.1 好处1.2 常用泛型2. 交集,差集等2.1 自身的方法2.2 1.8jdk stream 新特性2.3 Apache的CollectionUtils工具类(推荐)3. 限定泛型范围4. Awakening1. Introduction 1.1 好处 代码复用,多种…...
【Linux】网络编程 - Socket套接字/基于UDP的网络通信
目录 一.套接字 1.什么是套接字/Socket套接字 2.套接字的分类 3.Socket套接字的常见API 二.网络字节序 1.什么是网络字节序 2.网络字节序和主机字节序的转换接口 三.IP地址形式上的转换 四.客户端的套接字不由程序员bind 1.为什么客户端套接字不能由程序员bind 2.OS…...
流程引擎之Camunda简介
背景Camunda 是支持 BPMN(工作流和流程自动化)、CMMN(案例管理) 和 DMN(业务决策管理) java 框架。Camunda 基于Activiti5 保留了 PVM,其开发团队也是从 activiti 中分裂出来的。Camunda 来自拉…...
Mybatis笔记整理
1. 相关文档地址 中文文档 https://mybatis.org/mybatis-3/zh/index.htmlMybatis可以配置成适应多种环境,不过每个SqlSessionFactory实例只能选择一种环境。Mybatis默认事务管理器是JDBC,连接池:POOLEDMaven仓库:下载地址<dependency>…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
