首页 > 系统相关 >【C语言进阶】--- 动态内存管理

【C语言进阶】--- 动态内存管理

时间:2024-06-02 23:30:57浏览次数:22  
标签:malloc 进阶 int free --- 动态内存 空间 NULL size

动态内存管理函数

1. malloc函数

void* malloc(size_t size);
功能:向堆区的空间中申请一块大小为size个字节的空间,返回指向这块空间的指针

  • 如果开辟失败会返回一个NULL指针,因此要检查malloc的返回值,避免返回NULL指针后再访问空指针
  • malloc申请的空间,程序退出后会还给操作系统
  • 可以用free函数释放空间,释放空间后的指针需置NULL,避免成为野指针

2. free函数

void free(void* ptr);
功能:释放动态内存空间

  • free不能释放不是动态开辟的空间
  • 若参数ptr为NULL指针,则free什么都不做
  • malloc和free都声明再头文件stdlib.h头文件中

3. calloc函数

void* calloc(size_t num, size_t size);
功能:为num个大小为size的元素开辟空间,并且把空间中每个字节初始化为0

  • 与malloc的区别在于会初始化为0
  • int* p = (int*)calloc(10, sizeof(int));

4. realloc函数

void* realloc(void* ptr, size_t size);
功能:为ptr指向的空间扩充为或缩小成size个字节的大小,返回扩充或缩小后的地址

  • realloc的出现让动态内存管理更灵活
  • 当扩充内存时会出现两种情况:
    • 情况一:原有空间之后有足够大的空间,那么直接扩充,返回原来的地址
    • 情况二:原有空间之后没有足够的空间
      • 此时realloc会重新找一块内存
      • 然后将原来内存里的值靠白在新的空间中
      • 再释放原来的空间
      • 返回当前的新地址
        在这里插入图片描述
        注意:开辟的空间也可能失败,所以开辟完空间要判断是否为空
        特别地:realloc开辟完空间要用新的指针接收,否则,如果开辟失败返回NULL指针,那么原有的地址就丢失了,也无法释放
int* p = (int*)malloc(40);
int* newp = (int*)realloc(p, 80);
if(newp != NULL)
{
	//如果不为空说明开辟成功,后续用到的其实是指针p,newp只是临时指向新开辟的空间,既然开辟成功,那就让p指向新地址,置空newp
	p = newp;
	newp = NULL;
}
else
{
	perror("realloc");//这是一个打印错误提示信息的函数
}

常见错误

1. 对NULL指针解引用

int* p = (int*)malloc(40);
*p = 20;  
若malloc开辟失败返回NULL,则*p访问的就是空指针

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

int* p = (int*)malloc(40);
if(p == NULL)
{
	perror("malloc");
	return 1;
}
实际上当i>=10时,就超出了访问权限,因为空间只开辟了40个字节
for(int i = 0; i < 20; i++)
{
	p[i] = i;
}
free(p);
p = NULL;

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

int a = 20;
int* p = &a;
free(p);

4.使用free释放一块动态内存的一部分

int *p = (*int)malloc(40);
p = p+2;
free(p);

5. 重复释放同一块动态内存

6.忘记释放内存,出现内存泄露

标签:malloc,进阶,int,free,---,动态内存,空间,NULL,size
From: https://blog.csdn.net/weixin_59005084/article/details/139397734

相关文章

  • 数据结构--数组(详细分析)
    目录......
  • PTA-- 《面向对象程序设计》作业6--集合与容器
    目录6-1tjrac-Java集合类之List的ArrayList之增删改查 6-2tjrac-Java集合类之Map的HashMap之常用方法的使用  6-3tjrac-Java集合类之Set的HashSet之常用方法的使用6-1tjrac-Java集合类之List的ArrayList之增删改查仔细阅读下面编辑区内给出的代码框架及......
  • 微信小程序-声明和绑定事件
    一.概念小程序页面使用的数据在Page()方法里使用data对象进行声明定义定义好之后,使用{{}}进行绑定声明Page({data:{school:'未发之中',obj:{name:'dadada'},id:1,useChk:true}})绑定<!--使用双括号展示数据--><view>{{scho......
  • DVWA靶场---csrf遇到的问题解决方法
    1.解决low等级不携带cookie访问诈骗网站:设置---隐私与安全---浏览器隐私---增强型跟踪保护---自定义---cookie---跨站跟踪型cookie。2.解决medium等级referer显示不完整解决方法:在服务器的html上加一段:<metaname="referrer"content="no-referrer-when-downgrade">当从......
  • 【Python】生成html文档-使用dominate
    原文地址:https://www.cnblogs.com/kaerxifa/p/13035376.htmldominate简介dominate是一个使用优雅的DOMAPI创建和操作HTML文档的Python库。使用它能非常简洁地编写纯Python的HTML页面,这消除了学习另一种模板语言的需要,利用Python更强大的特性。 首先安装依赖:pipinstall......
  • FuTalk设计周刊-Vol.047
    #AI漫谈热点捕手1、李彦宏称程序员将不复存在未来编程语言只剩中英文在3月9日央视的《对话》·开年说节目上,百度创始人、董事长兼首席执行官李彦宏表示,以后不会存在“程序员”这种职业了,因为只要会说话,所有人都能具备程序员的能力。“未来的编程语言只会剩下两种,一种叫做......
  • 各位用到git的,请注意CVE-2024-32002安全漏洞
    解释几个缩写名词CVE:CVE是CommonVulnerabilitiesandExposures的缩写,指的是通用漏洞与暴露(CommonVulnerabilitiesandExposures),它是一个用于标识和跟踪计算机系统中的安全漏洞的标准化命名方案,每个CVE条目都包含一个唯一标识符(CVEID),以及漏洞的描述、评分、影响......
  • 【2024年5月备考新增】】 考前篇(25)《必备资料(8) - 论文串讲-成本管理》
    过程定义输入工具技术输出实际应用规划成本管理确定如何估算预算、管理、监督和控制项目成本1、项目章程2、项目管理计划.进度管理计划.风险管理计划3、事业环境因素4、组织过程资产1、专家判断2、数据分析.备选方案分析3、会议1、成本管理计划1、创......
  • <商务世界>《78 认证<CE-LVD认证>》
    1CE-LVD指令简介:LVD低电压指令定义概述:LVD是LowVoltageDirective的缩写,称之低电压指令,其规定范围是交流电压50伏特到1000伏特之间,直流电压75伏特到1500伏特之间的电气设备。2LVD安规测试项目安全测试内容1.工作电压2.故障试验3.撞击实验4.震动实验5.冲击试验6......
  • <商务世界>《77 认证<CE-EMC认证>》
    1CE-EMC认证概述国际电工委员会标准IEC对电磁兼容的定义是:系统或设备在所处的电磁环境中能正常工作,同时不对其他系统和设备造成干扰。为了规范欧盟各成员国对电器设备电磁兼容性的管理,是欧盟各成员国关于电磁兼容的法规协调一致,89/336/EEC电磁兼容指令于1989年5月1日颁布......