动态内存管理

动态内存管理详解 C语言中开辟内存有很多种方式,目前我们最常用的也就是数组,但数组是在我们用到他之前就得设定好它的长度,有时很不方便。 我们知道,c语言规定,不允许设定一个未知长度的数组。(但在Linux下可以设定,但也不支持这样做)下面这段代码就会报错哟!!! int x = 5; int arr[x];  所以,为了填补这一缺口,c语言有了动态内存,c语言提供了几个函数来管理我们的动态内存,这几个函数... 阅读详情

目录

1.malloc和free

2.calloc

3.常见的动态内存错误

4.柔性数组


为什么要进行动态内存分配

在之前的学习中,我们开辟内存空间都是固定的,例如

int a = 0;//开辟4个字节的内存空间
int char[10] = { 0 };//开辟10个字节的连续内存空间

但是,如果遇到不知道或者不确定要但是内存空间的时候,这样显然就不合适了。所以就出现了动态内存

1.malloc和free

void* malloc(size_t size);

malloc申请的空间在内存的堆区

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
如果参数 size 为0,这个malloc的行为是C语言标准未定义的,取决于编译器。
C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:

void free (void* ptr);

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

如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参数 ptr 是NULL指针,则函数什么事都不做。
动态内存函数都包含于<stdlib.h>这个头文件中。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* ptr = (int*)malloc(40);//malloc 函数会返回所申请的内存块的起始地址,返回类型为void*
	//将其强制类型转换为int*意思是所申请的这块空间之后将以整数对其进行访问操作
	int* p = ptr;//因为malloc要返回申请空间的起始地址,所以通常不直接对ptr操作,而是另外创建
	//一个指针存放ptr,后续对p进行操作
	if (p == NULL)
	{
		//malloc函数在申请内存空间时,若空间大小不够,会返回一个空指针
		//此时内存空间就会申请失败
		perror("malloc:");//打印程序错误信息,双引号内的内容由自己定
		//这里perror函数刚好可以验证空间是否申请成功
		return 1;//主函数中return 1表示程序异常结束
	}
	int i = 0;
	for (i = 0; i < 10; i++)//申请的空间大小为40个字节,转换为整形即10个整形
	{
		*p = i;
	}
	free(ptr);//申请的这块内存空间使用结束后,需要释放这片空间,free函数的参数为申请空间的起始地址
	ptr = NULL;//空间释放后,ptr仍然指向空间内的一个有效地址,为避免后续对其使用造成野指针的情况
	//通常在释放完空间后需将其置为空指针
	//因此若后续需要对ptr进行操作,我们可以用一个if语句进行判断限制,即
	//if (ptr != NULL)
	//{
		//*ptr = 100;
	//}
	//ptr被释放后若还对其使用,就会造成野指针
	return 0;
}

当我们不释放动态申请的内存的时候
 如果程序结束,动态申请的内存由操作系统自动回收
但是如果程序不结束,动态内存是不会自动回收的,就会形成内存泄漏的问题
 内存泄漏就是说开辟的空间没被释放,这块空间就会一直存在并不被使用,
 就像是这块空间突然消失了一样,所以称之为内存泄漏

需要说明的一点是:如果已经形成了内存泄漏,那么无论程序结束与否,那么这块空间都会被浪费掉,也就说内存泄漏一直存在。

2.calloc

void* calloc (size_t num, size_t size);

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配。原型如下:

void* calloc (size_t num, size_t size);

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

3.常见的动态内存错误

(1)对NULL指针的解引用操作

(2)对动态开辟空间的越界访问

(3)对非动态开辟内存使用free释放

(4)使用free释放一块动态开辟内存的一部分

(5)对同一块动态内存多次释放

(6)动态开辟内存忘记释放(内存泄露)

4.柔性数组

结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员

特点

(1)结构中的柔性数组成员前面必须至少一个其他成员

(2)sizeof返回的这种结构大小不包括柔性数组的内存

(3)包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小

Postman调试海康ISAPI接口全记录:从鉴权失败到成功修改设备名的踩坑指南 本文详细记录了使用Postman调试海康ISAPI接口的全过程,从鉴权失败到成功修改设备名的实战经验。涵盖Digest认证机制、XML请求体构造、常见错误排查及代码实现过渡,帮助开发者高效解决海康设备集成中的各种问题。 阅读详情

相关推荐

RFSoC应用XCZU47DR八发八收FPGA设计方案

本文介绍了基于Xilinx XCZU47DR RFSoC芯片的八发八收FPGA设计方案。该方案采用集成射频数据转换器的SoC架构,支持8路14bit ADC(5GSPS)和8路14bit DAC(9.85GSPS),可直接处理5GHz以下射频信号。硬件设计包含高性能输入缓冲器、QMC校正和复杂混频器,适用于5G/6G通信、雷达、卫星通信等领域。文章详细阐述了ADC/DAC子系统参数,包括通道配置、采样率、带宽等特性,并提供了FPGA顶层模块的硬件接口设计,展示了多通道数据收发处理能力。该方案无需外置混频器,

toonyhe的博客 1766

动态内存管理(想要了解动态内存管理,只需要看这一篇就足够了!)

动态内存管理(想要了解动态内存管理,只需要看这一篇就足够了!)

秋刀鱼不做梦的编程日常 3160

2024年最新双摄像头的实时视频拼接及目标跟踪(一)_监控视频拼接实时(1),网络相关+C C++三方库的源码分析+数据结构与算法

opencv中采用了SURF,ORB进行特征点提取,如果装的是opencv2.0版本,则可以直接用SURF,如果是3.0版本,则需要下载相应的contrib库进行安装。原理不赘述,给出其实验结果对比和分析,原始图像1SURF特征点提取网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远!

m0_51437227的博客 930

动态内存管理——详解,彻底理解动态内存管理

将在本文中,彻底讲解什么是动态内存分配,如何使用内存分配的函数,以及常见的动态内存分配的错误。此外,还将拓展讲解柔型数组的动态内存分配,了解什么柔性数组

jupangMZ的博客 1553

2025-08-19利用opencv检测图片中文字及图片的坐标

该代码实现了图片中中文文本的检测与位置计算功能。主要使用CnOcr库进行OCR识别,结合OpenCV和PIL库处理图像。功能包括:1)检测图片中的中文文本及位置坐标;2)计算每个文本的像素宽度和高度;3)在原图上绘制文本边界框并标注识别结果。代码通过put_chinese_text函数解决中文显示问题,最终输出各文本内容、坐标位置及尺寸信息。适用于需要获取图片中文字精确位置的应用场景。

m0_58149406的博客 392

从零到一:高通Memory QMVS测试环境搭建的避坑指南

本文详细介绍了高通Memory QMVS测试环境搭建的全流程避坑指南,涵盖硬件选择、软件配置、QMVS核心组件安装及测试执行技巧。重点解析了adb工具配置、QPST日志抓取等关键步骤,帮助工程师高效搭建稳定测试环境,避免常见兼容性和稳定性问题。

weixin_29251567的博客 544

【c++】动态内存管理

1. new:首先调用operator new函数申请内存空间,然后调用构造函数,完成初始化2. delete:首先调用析构函数,对开辟的内存进行资源清理,然后调用operator delete函数释放内存3. new[]:首先调用 operator new[ ] 函数申请多个对象的内存空间(该函数中调用了operator new),然后调用N次构造函数,完成初始化。

2301_80955819的博客 1733

Jenkins Job DSL:用代码管理CI/CD配置的实践指南

Jenkins 是持续集成(CI)领域的经典开源平台,其核心价值在于自动化构建与交付流程。然而传统 UI 配置方式导致配置不可版本化、难以复现、审计困难,严重制约团队规模化协作效率。Job DSL 作为一种声明式配置即代码(IaC)方案,通过 Groovy 脚本驱动 Jenkins 内部 API,实现 Job、View、Folder 等资源的程序化创建与维护,天然支持 Git 版本控制、权限审计与环境一致性保障。它不替代 Pipeline,而是与其协同构成‘流程定义’与‘基础设施定义’双轨体系,显著提升 C

weixin_33744141的博客 510

【C语言】动态内存管理

详细分析了C语言动态内存分配的方法,讲解了malloc()、calloc()、realloc()和free()函数的使用细节和场景,给出了常见动态内存分配的错误情况以及相关的笔试题,最后谈到了柔性数组,分析了其使用细节和优势所在。

ElvInR的博客 1424

硅电容的工艺结构原理及选型参数总结

硅电容,也称为硅质电容或硅二极管电容,是一种特殊的电容器。它利用硅二极管的结构来实现电容的功能。本文对硅电容的工作原理,结构特点,选型参数及设计注意事项进行总结。

fydar的博客 2311

设计四翼无人机(Quadcopter)的自主降落控制算法

为四翼无人机建立动力学模型,包括其姿态(Pitch, Roll, Yaw)和位置(X, Y, Z)的变化。可以使用Aerospace Blockset中的预制模块,或者根据具体需求构建自定义模型。示例:简化动力学模型利用块模拟四翼无人机的基本行为,确保模型能够反映电机输出如何影响姿态和位置变化。

amy_mhd的博客 239

图解动态内存管理

基于著名书籍和自我研究得出的动态内存管理的精华知识

修行的凡人的博客 3075

连续相位调制通信调制方法的载波同步和定时同步研究及MATLAB仿真

本文将探讨CPM调制方法中的载波同步和定时同步问题,并提供MATLAB仿真源代码。本文讨论了连续相位调制通信中的载波同步和定时同步问题,并提供了相应的MATLAB仿真源代码。通过适当的载波同步和定时同步方法,可以实现对CPM信号的准确解调。希望本文对您理解连续相位调制通信调制方法的载波同步和定时同步问题有所帮助,同时也为您提供了一些MATLAB仿真实现的思路和示例代码。在CPM系统中,载波同步的主要任务是估计接收信号的载波频率偏移和相位偏移。在CPM系统中,常用的定时同步方法是基于自相关函数的峰值检测。

2301_79331230的博客 687

C语言——动态内存管理

本文介绍了动态内存分配的相关知识,包括设置动态内存分配的原因、常用函数(malloc、free、calloc、realloc)的使用方法及注意事项,并分析了常见动态内存错误和柔性数组的特点。主要内容概括为:动态内存分配可以灵活调整空间大小,但需谨慎使用以避免内存泄漏或越界访问;malloc和free需配对使用,realloc可调整已分配空间大小;柔性数组作为结构体末尾的未知大小数组,需配合malloc使用。文章通过代码示例详细说明了正确用法和常见错误,并对比了两种柔性数组实现方式的优缺点。

ghjghj_的博客 1586

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言 — 动态内存管理(动态内存函数)

本期博客的重要点概况: malloc函数:用于动态内存的开辟 calloc函数:也是用于动态内存开辟,区别于malloc,calloc函数会将每一个字节初始化为0 realloc函数:用于扩展内存空间,需要注意增加内存的返回,分为情况1和2 free函数:用于释放动态内存空间

小黄鸭的博客 2007

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 数据在内存中的存储
下一篇: 数据结构––kmp算法(串)
无聊的框框
博客等级 码龄3年 526粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值