动态内存管理函数(malloc,calloc,realloc,free)

news2024/11/25 12:27:12

动态内存函数

1.1malloc和free

C语言提供了一个动态内存开辟的函数:

void* malloc (size_t size);

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

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

使用malloc开辟空间实例: 

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	char* p = (char*)malloc(10);
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	int a = 97;
	for (int i = 0; i < 10; i++)
	{
		*p = a;
		printf("%c ",*p);
		a++;
	}
	free(p);
	p = NULL;
	return 0;
}

在上面的代码中我们看到了陌生的free函数,这个函数是做什么用的呢?

可以看到标题写的malloc和free函数是搭配在一起来使用的,我们既然向内存借用申请了空间,那么在结束的是时候一定要free释放掉我们借来的“东西”。 

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的:

void free (void* ptr);

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

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做。

1.2calloc

C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配:

void* calloc (size_t num, size_t size);

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

calloc函数实例:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int main()
{
	int* p = (int*)calloc(10, sizeof(int));//开辟10个整型大小的空间----40字节
	if (p == NULL)
	{
		perror("calloc");
		return 1;
	}

	free(p);
	p = NULL;
	return 0;
}

 

 开辟出来的40个字节的内存空间在最初就被初始化为0了

1.3realloc

realloc函数的出现让动态内存管理更加灵活。
有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了更合理使用内存,我们会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小进行二次调整。
void* realloc (void* ptr, size_t size);
  • ptr 是要调整的内存地址
  • size 是调整之后新大小
  • 返回值为调整之后的内存起始位置。
  • 这个函数在调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。

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

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

  •  当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
  • 当是情况 2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址
#include <stdio.h>
int main()
{
	int* ptr = (int*)malloc(100);
	if (ptr != NULL)
	{
		//业务处理
	}
	else
	{
		exit(EXIT_FAILURE);
	}
	//扩展容量
	//代码1
	ptr = (int*)realloc(ptr,INT_MAX);//这样可以吗?(如果申请失败会如何?)//更改申请的内存空间大小,如果更改的时候后续空间不足会发生原申请的内存空间指针丢失的后果

	//业务处理
	free(ptr);
	return 0;
}

正确使用方式应该是额外使用一个变量来接收  realloc  开辟的内存空间的地址,如果开辟成功则返回地址再赋给ptr,这样就保证了原来开辟空间的地址不会丢失,避免造成内存泄漏

 正确方式:

#include <stdio.h>
int main()
{
int *ptr = (int*)malloc(100);
if(ptr != NULL)
{
//业务处理
}
else
{
exit(EXIT_FAILURE);
}
//扩展容量

//正确恰当的方式避免出现内存泄漏问题:
int*p = NULL;
p = realloc(ptr, 1000);
if(p != NULL)
{
ptr = p;
}
//业务处理
free(ptr);
return 0;
}

感谢支持!

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

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

相关文章

基于YOLOv8模型的120类狗狗目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的120类狗狗目标检测系统可用于日常生活中检测与定位车辆目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

CMYK to RGBA

1、 算法原理 我们首先来看算法原理: 显而易见,CMYK是存储起来的四个值,通过变换可以转换成RGBA值,其中A值始终为255 2、原始代码 // The original code uses a macro UNROLL8 to unroll code and // each iteration processes eight pixels. // // The macro actually…

Spring的AOP开发-AOP简介

目录 AOP简介 AOP概念 AOP思想的实现方案 模拟AOP的基础代码 AOP相关概念 AOP简介 AOP概念 AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程&#xff0c;是对面向对象编程OOP的生化&#xff0c;OOP是纵向对一个事务的抽象&#xff0c;一个对象包括静…

AIGC之下的创意革命,每个人都是文明的设计师

创意&#xff0c;人类文明的灵魂和火花。人类族群进入文明社会以来&#xff0c;创作基本由少数精英主导&#xff0c;以孔子为代表的东方教育家、哲学家提出由“学在民间”替代“学在官府”的知识传播体系也并未得到真正构建&#xff0c;作品一贯通过有限的渠道传播&#xff0c;…

rsync 远程同步实现快速、安全、高效的异地备份

目录 1 rsync 远程同步 1.1 rsync是什么&#xff1f; 1.2 rsync同步方式 1.3 rsync的特性 1.4 rsync的应用场景 1.5 rsync与cp、scp对比 1.6 rsync同步源 2 配置rsync源服务器 2.1 建立/etc/rsyncd.conf 配置文件 3 发起端 4 发起端配置 rsyncinotify 4.1 修改rsync…

VB编程实现股票量化交易之K线图显示

最近在一个朋友的推荐下&#xff0c;开始研究股票的量化交易系统的开发&#xff0c;这里除了股票数据接口 要实现量化交易不难&#xff0c;基本点就是要有股票数据接口和股票交易接口&#xff0c;还有一些针对指标的策略算法。 Private Function CursorInfo(x As Integer, y A…

java:代理模式

概念代理模式 概念&#xff1a; 真实对象&#xff1a;被代理的对象&#xff0c;背景的联想总部代理对象&#xff1a;也就是那个西安联想代理商代理模式&#xff1a;代理对象代理真实对象&#xff0c;达到增强真实对象功能的目的 实现方式&#xff1a; 静态代理&#xff1a;有一…

vuejs中使用axios时如何追加数据

前言 在vuejs中使用axios时&#xff0c;有时候需要追加数据,比如,移动端下拉触底加载,分页加载,滑动滚动条,等等,这时候就需要追加数据了,下面我们来演示下. 代码演示 <template><div><div><el-button type"primary" click"handleBtnGetJ…

AK F.*ing leetcode 流浪计划之最近公共祖先(倍增算法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;在树上查找2个结点的最近公共祖先 问题提出 最近公共祖先定义 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节…

STM32MP157汇编流水灯

.text .global _start _start: /* 使能GPIOE、GPIOF寄存器 RCC_MP_AHB4ENSETR * 基地址: 0x50000000 偏移地址: 0xA28 0x50000A28* RCC_MP_AHB4ENSETR[4]->1 RCC_MP_AHB4ENSETR[5]->1*/ LDR R0,0x50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<4)STR R1,[R0]LDR R0,0x…

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)

目录 作用域 局部作用域 函数作用域 块作用域 全局作用域 作用域链 JS垃圾回收机制 垃圾回收机制算法说明&#xff1a; 引用计数法(了解)&#xff1a; 标记清除法&#xff1a; 闭包 为什么要有闭包&#xff1f; 闭包的风险→内存泄漏 变量提升 函数进阶 函数提升…

前端uniapp如何修改下拉框uni-data-select下面的uni-icons插件自带的图片【修改uniapp自带源码图片/图标】

目录 未改前图片未改前源码未改前通过top和bottom 和修改后图片转在线base64大功告成最后 未改前图片 未改前源码 然后注释掉插件带的代码&#xff0c;下面要的 未改前通过top和bottom 和修改后 找到uni-icons源码插件里面样式 图片转在线base64 地址 https://the-x.cn/b…

防火墙是什么?F5保护Web应用的思路解读

Web 应用防火墙 (WAF) 是保护 Web 应用的必要措施。如今&#xff0c;WAF 需要在部署环境不断扩展但人员技能有限的情况下&#xff0c;保护数量日益增长的应用。那么防火墙是什么&#xff1f;作为一家提供多云应用安全和应用交付的公司&#xff0c;F5为保护Web应用又打造出哪些产…

javaWeb宠物领养系统

一、引言 1.1 系统背景 计算机网络的发展&#xff0c;促进了社会各行业的进步&#xff0c;带来了经济快速增长。管理员通过流浪宠物的信息&#xff0c;在平台上和领养人进行实时的交流&#xff0c;达成领养协议。用户登录后&#xff0c;把想要领养的宠物向本平台发起申请&…

软件安全测试的含义是什么?

早在信息行业发展的初期&#xff0c;就有互联网公司意识到了保护软件产品安全的重要性&#xff0c;可时至今日&#xff0c;我们总能够从报道中瞥见某某公司遭黑客入侵导致信息泄露的新闻&#xff0c;其中甚至不乏Facebook这些以用户通讯、身份信息为支柱产业的大厂。 信息安全事…

【全网最详细的OSPF原理总结,看这篇就够了!】

OSPF是一种基于链路状态的路由协议&#xff0c;也是专为 IP 开发的路由协议&#xff0c;直接运行在 IP 层上面。它从设计上保证了无路由环路。除此之外&#xff0c;IS-IS也是很常见的链路状态协议。 为什么会出现OSPF&#xff1f; 作为目前主流的IGP协议&#xff0c;OSPF主要…

vs code拉取代码到本地汉字乱码--解决

首先&#xff0c;默认情况下&#xff0c;我们使用VS Code打开一个utf-8编码的文件和一个gb2312编码的文件&#xff0c;期中gb2312文件乱码了。 VSCode通常默认UTF-8编码。 解决方法&#xff1a; 点击右下角的编码按钮&#xff08;图中为UTF-8&#xff09;&#xff0c;然后选…

46 二叉树展开为链表

二叉树展开为链表 理解题意&#xff1a;前序遍历的N种写法题解1 前序遍历题解2 反前序遍历(代码简洁)题解3 类似旋转的方法题解4 迭代题解5 同时遍历改左右子树 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNo…

判断当日是否为当月第一个交易日——时间相关函数3

本文介绍的函数用于判断当前交易日是否为当月的第一个交易日。 在某些策略中&#xff0c;可能会在每月的第一个交易日进行调仓换股。这时&#xff0c;就可以使用本文介绍的函数判断当日是否为当月的第一个交易日。 源码 def is_first_trading_day_of_month():""&q…

老虎证券当前股价已严重背离基本面,下半年收入将下滑

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 老虎证券近期股价表现优异 在过去的一个月里&#xff0c;老虎证券(TIGR)的股价表现令人惊叹&#xff0c;其估值也大幅上升。 在过去一个月里&#xff0c;老虎证券的股价上涨了45.0%&#xff0c;而同期以标普500指数为代表的…