malloc calloc和realloc区别和联系

news2024/11/24 6:41:26

malloc

malloc是一个⼀个动态内存开辟的函数:
它的函数原型是void* malloc (size_t size);这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针。
1.如果开辟成功,则返回⼀个指向开辟好空间的指针。
2.如果如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查。

#include<stdlib.h>
#include<stdio.h>
int main()
{
	int* ptr = (int*)malloc(sizeof(int) * 10);
	if (ptr == NULL)//判断开辟是否失败
	{
		//perror("malloc fail");
		printf("内存分配失败");
		return 1;
	}
	for (int i = 0; i <= 10; i++)
	{
		ptr[i] = i;
	}
	for (int i = 0; i <= 10; i++)
	{
		printf("%d ", ptr[i] );
	}
	free(ptr);//释放空间
	return 0;
}

运行结果如图
在这里插入图片描述
3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者自己来决定。

free

函数free,专门是⽤来做动态内存的释放和回收的,函数原型如下:

void free (void* ptr);
free函数⽤来释放动态开辟的内存。
1.如果参数 ptr 指向的空间不是动态开辟的,那free函数的⾏为是未定义的。
2.如果参数 ptr 是NULL指针,则函数什么事都不做。
malloc和free都声明在 stdlib.h 头文件中。

calloc

还有⼀个函数叫 calloc , calloc 函数也⽤来动态内存分配。原型如下:void* calloc (size_t num, size_t size);
1.这个函数的功能是为 num 个⼤⼩为 size 的元素开辟⼀块空间,并且把空间的每个字节初始化为0。
2.与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0.


#include<stdlib.h>
#include<stdio.h>
int main()
{
	int* ptr = (int*)calloc(10,sizeof(int));
	if (ptr == NULL)//判断开辟是否失败
	{
		printf("内存分配失败");
		return 1;

	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", ptr[i]);
	}
	free(ptr);//释放空间
	return 0;
}

在这个例子中:
首先使用 calloc 函数分配了能存储5个整数的内存空间,它会将分配的内存初始化为0。
1.然后通过循环给分配的内存空间(这里当作数组来使用)赋值。
2.接着又通过循环输出了数组的值。
3.最后使用 free 函数释放了之前通过 calloc 分配的内存,避免内存泄漏。
输出的结果为:
在这里插入图片描述

realloc

realloc函数的出现让动态内存管理更加灵活。
有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的时候内存,我们⼀定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。
其函数原型如下void* realloc (void* ptr, size_t size);

ptr是要调整的内存地址,如果ptr是一个空指针,则该函数的行为类似于malloc,分配一个大小为字节的新块,并将指针重新调整到其开头
size 调整之后新大小单位是字节,返回值为调整之后的内存起始位置。

#include<stdlib.h>
#include<stdio.h>

int main()
{ 
	int *ptr = (int*)malloc(sizeof(int)*5);
	if (ptr == NULL)
	{
		printf("内存分配失败");
		return 1;
	}
	//给数组赋值
	for (int i = 0; i < 5; i++)
	{
		ptr[i] = i;
	}	
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", ptr[i] = i);
	}
	printf("\n");
	//扩大这个数组,用realloc重新分配内存,新的大小可以容纳10个整型
	int *new_ptr = (int*)realloc(ptr, sizeof(int) * 10);\
		if (new_ptr == NULL)
		{
			printf("内存分配失败");
			free(ptr);
			return 1;
		}
	ptr = new_ptr;
	for (int i = 5; i < 10; i++)
	{
		ptr[i] = i;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", ptr[i] = i);
	}
	free(ptr);
	return 0;
}

输出的结果为:
在这里插入图片描述

最后要记得释放内存。

realloc在调整内存空间的是存在两种情况:
1.原有空间之后有足够大的空间时,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
2.原有空间之后没有足够大的空间,扩展的方法是:在堆空间上另找⼀个合适⼤小的连续空间来使⽤。这样函数返回的是⼀个新的内存地址。

malloc calloc和realloc区别和联系。
区别
功能特性

  • malloc:用于分配指定字节数的内存空间。例如 malloc(10 * sizeof(int)) ,会分配能存储10个 int 类型数据的空间,但不会初始化这些内存空间,内存中的初始值是不确定的。
  • calloc:会在分配内存后,将内存空间的每一位都初始化为0。如 calloc(10, sizeof(int)) ,也是分配能存储10个 int 类型数据的空间,不过这些空间会被初始化为0。
  • realloc:主要用于修改之前已经通过 malloc 或 calloc 等分配的内存大小。例如,之前分配的内存空间不够用了,就可以用 realloc 来重新分配一个更大(或更小)的空间。

参数类型

  • malloc:接受一个参数,即需要分配的字节数,如 malloc(size_t size) 。
  • calloc:接受两个参数,第一个是要分配的元素个数,第二个是每个元素的大小,格式是 calloc(size_t num, size_t size) 。
  • realloc:接受两个参数,第一个是指向原来内存块的指针,第二个是重新分配后的新大小,像 realloc(void *ptr, size_t new_size) 。

返回值情况

  • malloc:如果分配成功,返回一个指向所分配内存的起始地址的指针;如果分配失败,则返回 NULL 。
  • calloc:分配成功返回指向已清零的内存的起始地址指针,失败返回 NULL 。
  • realloc:成功时返回一个指向重新分配后的内存起始地址的指针(这个指针可能和原来的一样,也可能不同),失败则返回 NULL 。当返回 NULL 时,原来的内存块不会被释放。

这三个函数都需要通过这三个函数分配的内存,最后都要用 free 函数来释放,以避免内存泄漏。

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

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

相关文章

Android studio中关于printf和print和println的区别

print:为一般输出&#xff0c;同样不能保留精度格式转化&#xff0c;也不能换行输出&#xff0c;输出需要加上换行符printf:常用于格式转换&#xff0c;但需要注意不是换行输出&#xff0c;只用于精度转换&#xff0c;跟C语言的printf一样的&#xff0c;输出需要加上换行符prin…

计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

文章目录 一、TCP/IP五层模型&#xff08;重要&#xff09;二、应用层常见的协议三、TCP与UDP3.1 TCP、UDP的区别&#xff08;重要&#xff09;3.2 运行于TCP、UDP上的协议3.3 TCP的三次握手、四次挥手3.3.1 TCP的三次握手3.3.2 TCP的四次挥手3.3.3 随机生成序列号的原因 四、T…

分布式——BASE理论

简单来说&#xff1a; BASE&#xff08;Basically Available、Soft state、Eventual consistency&#xff09;是基于CAP理论逐步演化而来的&#xff0c;核心思想是即便不能达到强一致性&#xff08;Strong consistency&#xff09;&#xff0c;也可以根据应用特点采用适当的方…

【RabbitMQ】07-业务幂等处理

1. 方式一 序列化设置唯一Id。 Beanpublic MessageConverter messageConverter() {Jackson2JsonMessageConverter jjmc new Jackson2JsonMessageConverter();jjmc.setCreateMessageIds(true);return jjmc;}RabbitListener(bindings QueueBinding(value Queue(name "d…

【多线程奇妙屋】你听说过设计模式吗?软件开发中可全局访问一个对象的设计模式——单例模式,工作常用, 建议收藏 ! ! !

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

android studio 配置过程

Android studio版本&#xff1a;Android Studio Ladybug | 2024.2.1 windows 10 x64 关键问题解决方法&#xff1a; 1.设置代理&#xff1a; 退出首次配置&#xff0c;进入ide&#xff08;必要时新建工程&#xff09;然后&#xff1a; 然后重启ide 等待下载完成。 代理地…

java ssm 个人学习管理系统 学习安排 学生在线学习管理 源码 jsp

一、项目简介 本项目是一套基于SSM的个人学习管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

harbor官网地址&#xff1a;Harbor 参考文档可以看这里&#xff1a;部署 harbor 2.10.1 arm64 - 简书。 前提环境准备&#xff1a; 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…

ssm+vue708基于BS的库存管理软件设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

速通LoRA:《LoRA: Low-Rank Adaptation of Large Language Models》全文解读

文章目录 总览AbstractIntroductionProblem StatementAren’t Existing Solutions Good Enough?Our MethodLow-Rank-Parametrized Update MatricesApplying LoRA to Transformer 何为高斯随机初始化Empirical ExperimentsBaselinesRoBERTa base/largeDeBERTa XXLGPT-2 medium/…

智慧园区解决方案:科技赋能,打造未来管理新典范

智慧园区作为城市发展的重要组成部分&#xff0c;正以前所未有的速度蓬勃发展。随着5G、云计算、大数据、物联网&#xff08;IoT&#xff09;、BIM&#xff08;建筑信息模型&#xff09;、人工智能&#xff08;AI&#xff09;及区块链等前沿技术的日益成熟与融合应用&#xff0…

如何优化Elasticsearch的查询性能?

优化Elasticsearch查询性能可以从以下几个方面进行&#xff1a; 合理设计索引和分片&#xff1a; 确保设置合理的分片和副本数&#xff0c;考虑数据量、节点数和集群大小。根据数据量和节点数量调整分片数量&#xff0c;避免使用过多分片&#xff0c;因为每个分片都需要额外的…

前端 JS面向对象 原型 prototype

目录 一、问题引出 二、prototype原型对象 三、小结 四、constructor 五、__proto__对象原型 六、原型链 一、问题引出 由于JS的构造函数存在内存浪费问题&#xff1a; function Star(name,age){this.namenamethis.ageagethis.singfunction () {console.log("唱歌&…

【MATLAB代码】二维平面上的TDOA,使用加权最小二乘法,不限制锚点数量,代码可复制粘贴

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法,利用多个锚点(基站)和时间差到达(TDOA)数据来估计未知目标的位置。 订阅专栏后可以看到完整代码,复制到MATLAB空脚本上面即可直接运行。若需要单独下载,可通过下面的链接:https://download.cs…

推荐一款完全开源的多端仓库管理系统

简介 模块 安装 UI展示 开源地址 今天给大家介绍一款完全开源的仓库管理系统&#xff0c;本系统采用Python语言开发。 简介 该库存管理系统是目前福特亚太区售后物流仓储供应链流程。离开福特后&#xff0c;开始了这个项目。为了帮助一些有需要的人。OneAPP 理念。支持扫…

第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)

这个多通道采用非扫描模式--单次转换模式 1.代码配置链路图 2. ADC的输入通道 3.ADC的非扫描模式的转换模式&#xff08;单次和连续&#xff09; 4.ADC的扫描模式的转换模式&#xff08;单次和连续&#xff09; 5.采集校准 代码实验&#xff1a; 代码部分&#xff1a; #inclu…

手持测温热像仪市场规模:预计2030年全球市场规模将达到24.9亿美元

手持测温热像仪是一种能够实时监测和记录物体表面温度分布的高科技仪器。其核心功能在于&#xff0c;利用物体自身辐射出的热红外线来生成可视化的温度分布图像&#xff0c;进而为各种应用提供精准的温度数据。这一技术的普及和应用&#xff0c;无疑极大地提升了我们对于物体温…

web——[SUCTF 2019]EasySQL1——堆叠注入

这个题主要是讲述了堆叠注入的用法&#xff0c;来复现一下 什么是堆叠注入 堆叠注入&#xff1a;将多条SQL语句放在一起&#xff0c;并用分号;隔开。 1.查看数据库的名称 查看数据库名称 1;show databases; 发现有名称为ctftraining的数据库 2.对表进行查询 1;show tabl…

数据结构选择题及答案

一、选择题 1、下列查找方法中&#xff0c;&#xff08; &#xff09;适用于查找有序单链表。 A&#xff0e;分块查找; B&#xff0e;哈希查找; C&#xff0e;顺序查找; D&#xff0e;二分查找; 2、在有n个结点的二叉树的二叉链表表示中&#xff0c;空指针数为( )。 A&#xf…

GraphQL在现代Web开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 GraphQL在现代Web开发中的应用 GraphQL在现代Web开发中的应用 GraphQL在现代Web开发中的应用 引言 GraphQL 概述 定义与原理 发展…