动态内存管理之malloc,free,calloc和realloc函数

Hello,各位小伙伴们,小编在这里祝福各位中秋佳节快乐呀,今天让我们来学习一下动态内存管理吧!

引言

像我们之前在开辟一段空间的时候你可能会使用整型变量来申请一块空间,或者使用数组来申请一段连续的空间,但它们的空间大小都是在创建变量的时候确定的!难免会造成空间的浪费或者超出空间大小。为了解决这一问题,设计了动态内存管理。

动态内存管理大大提高的空间的灵活度但也出现了一些新的问题:越是灵活越容易出错!

让我们来学习一下这四种函数吧!

1-->malloc

void*malloc(size_t size);

在进行动态内存开辟的时候,如果开辟成功就会返回一个开辟好空间的指针。如果开辟失败将会返回空指针!

例如:

#include<stdio.h>
int main ()
{
    int *a = (int*)malloc(40);
    if(a==NULL)
    {
        perror("malloc");
        return 1;//出现错误返回
    }
    int i = 0;
    for(i = 0;i < 10;i++)
    {
        *(p+i) = i+1;
    }
    for(i = 0;i < 10;i++)
    {
        printf("%d ",*(p+i));
    }
    free(a);
    a = NULL;
    return 0;
}

要增加一个判断语句来判断a是否为空指针!

2-->free

malloc是用来申请空间的,但申请之后要及时释放!free函数就是专门为malloc来释放空间的。在释放之后,p指向的地址还给操作系统,但源地址仍然可以找到,但p不能在使用了。这样就会1造成空指针,所以在释放之后要对原来的指针变量设为空指针!

但值得注意的是,free所释放的空间必须是动态内存空间不能对非动态内存进行释放!

3--> calloc

calloc也是用来开辟空间的,与malloc有相同的地方。

void*calloc(size_t num , size_t size);

calloc所指向的num为某种类型的个数,size为该类型的大小。

如果要申请5个整型大小的空间

#include<stdio.h>
int main ()
{
    int *p = (int*)calloc(5 , sizeof(int));
    if(p ==NULL)
    {
        perror("calloc");
        return 1;
    }
    int i = 0;
    for(i = 0;i < 5;i++)
    {
        *(p+i) = i+1;
    }
    free(p);
    p = NULL;
    return 0;
}

 与malloc不同的是calloc在申请空间的时候会对所申请的空间进行初始化处理,初始化为0。

而malloc不会对所申请的空间进行初始化处理!

malloc的调试图
calloc的调试图

 4-->realloc

realloc是让动态管理内存更加灵活,有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的使用内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。

void *realloc(void*ptr , size_t size );

ptr是要调整的地址,size是调整后地址的大小。

同时realloc的调整方式有两种:1、如果后面内存空间足够大,直接在原来的基础上增加内存空间大小

2、如果后面内存空间不够大,则会重新找一块能够满足空间大小的内存,将原来的内容先拷贝进去,然后在后面进行调整。

第二种情况

 

让我们来看看如何具体使用:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(20);
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		*(p + i) = 1 + i;
	}
	int*ptr = (int*)realloc(p, 40);//增加5个整型
	if (ptr != NULL)
	{
		p = ptr;
	}
	else
	{
		perror("realloc");
		return 1;
	}
	for (i = 5; i < 10; i++)
	{
		*(p + i) = 1 + i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

 同时realloc可以实现malloc的功能,将ptr传递空指针就可以啦。

#include<stdio.h>
#include<stdlib.h>
int main ()
{
    int *p = (int *)realloc(NULL,40);
    if(p==NULL)
    {
        perror("realloc");
        return 1;
    }
    int i = 0;
    for(i = 0;i < 10 ;i++)
    {
        *(p+i) = i+1;
    }
    for(i = 0;i < 10;i++)
    {
        printf("%d ",*(p+i));
    }
    free(p);
    p = NULL;

    return 0;
}

OK,今天的内容就到这里啦!祝各位小伙伴们好时节,愿得年年,常见中秋!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全学习(五)Burpsuite实战

bp功能确实强大&#xff0c;记录一个bp手机验证码的实例。 当然&#xff0c;首先要打开bp&#xff0c;设置好浏览器的代理。 浏览器访问实例网址www.xxx.com&#xff08;隐藏真实网址&#xff09;。 真实网址有个注册功能&#xff0c;需要手机验证码。 好的&#xff0c;我们…

国产GPU距离“平替”英伟达还有多远?

在8月的尾声&#xff0c;一则关于象帝先计算技术&#xff08;重庆&#xff09;有限公司的消息如同惊雷般炸响在科技界&#xff0c;不仅让公司员工措手不及&#xff0c;也让整个市场陷入了深思。据传&#xff0c;这个曾被誉为国产GPU领域新星的独角兽企业&#xff0c;在最后一个…

力扣题解815

大家好&#xff0c;欢迎来到无限大的频道。祝大家中秋节快乐​。 今日继续给大家带来力扣题解。 题目描述&#xff08;困难&#xff09;​&#xff1a; 公交路线 给你一个数组 routes &#xff0c;表示一系列公交线路&#xff0c;其中每个 routes[i] 表示一条公交线路&…

【Linux】探索文件I/O奥秘,解锁软硬链接与生成动静态库知识

目录 1、C文件接口 1.1什么是当前路径&#xff1f; 1.2程序默认打开的文件流&#xff1a; 2、系统文件I/O 2.1.接口介绍&#xff1a; 2.1.1open&#xff1a; 参数讲解; flags如何实现一个参数就可以有多个参数传参的效果&#xff1f; open函数的返回值&#xff1a; 3…

SLAM面经1(百度)

百度面经 百度共三面,如果面试效果俱佳,会增加一个hr面。前二面主要是技术面,分为在线coding+代码知识+专业知识+工程能力。第三面是主管面,偏向于管理方面,和hr面相似。 一面 1)在线coding 在线coding的考试内容为下面力扣的变种。 2)专业面 (1)VINS-FUSION与ORB…

html+css+js网页设计 旅游 龙门石窟4个页面

htmlcssjs网页设计 旅游 龙门石窟4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

SpringBoot3核心特性-核心原理

目录 传送门前言一、事件和监听器1、生命周期监听2、事件触发时机 二、自动配置原理1、入门理解1.1、自动配置流程1.2、SPI机制1.3、功能开关 2、进阶理解2.1、 SpringBootApplication2.2、 完整启动加载流程 三、自定义starter1、业务代码2、基本抽取3、使用EnableXxx机制4、完…

eclipse使用 笔记02

创建一个项目&#xff1a; 【File-->New-->Dynamic Web Project】 进入页面&#xff1a; Project name为项目命名 Target runtime&#xff1a;选择自己所对应的版本 finish创建成功&#xff1a; 创建成功后的删除操作&#xff1a; 创建前端界面&#xff1a; 【注意&a…

第十一章 【后端】商品分类管理微服务(11.1)——创建父工程

第十一章 【后端】商品分类管理微服务 11.1 创建父工程 项目名称:EasyTradeManagerSystem:Easy 表示简单易用,Trade 表示交易,Manager 表示管理,System 表示系统,强调系统在商品交易管理方面的便捷性,简称 etms。 新建工程 yumi-etms yumi-etms 作为所有模块的父工程,…

TortoiseSVN图标不显示的解决

解决办法一:修改svn软件的图标设置 1、选中一个文件夹或在桌面空白处,右击进入svn的setting 2、进入setting->Icon Overlays,Status cache选择Default或shell,然后点击应用 3、查看文件,图标可以正常显示 解决办法二:修改注册表的文件夹顺序 问题现象: 1、svn一直…

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …

行车记录仪内存卡无法读取:问题解析与高效数据恢复策略

在智能出行的时代&#xff0c;行车记录仪作为车辆安全的守护者&#xff0c;其重要性不言而喻。然而&#xff0c;当行车记录仪的内存卡遭遇无法读取的困境时&#xff0c;不仅会影响行车记录仪的正常工作&#xff0c;更可能导致关键证据和美好回忆的丢失。本文将深入探讨行车记录…

基础 Web 开发

1. 构建项目&#xff1a; 2.添加依赖 <dependencies> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupI…

Vue3 : ref 与 reactive

目录 一.ref 二.reactive 三.ref与reactive的区别 四.总结 一.ref 在 Vue 3 中&#xff0c;ref 是一个用于创建可读写且支持数据跟踪的响应式引用对象。它主要用于在组件内部创建响应式数据&#xff0c;这些数据可以是基本类型&#xff08;如 number、string、boolean&…

【卷起来】VUE3.0教程-09-整合Element-plus

最后一次课了&#xff0c;给个关注和赞呗 &#x1f332; 简介 Element Plus 是一个基于 Vue 3 的高质量 UI 组件库。它包含了丰富的组件和扩展功能&#xff0c;例如表格、表单、按钮、导航、通知等&#xff0c;让开发者能够快速构建高质量的 Web 应用。Element Plus 的设计理念…

在 Mac 上安装虚拟机怎么样,安装虚拟机与直接安装 Windows 系统有区别吗?

随着跨系统操作的不断发展&#xff0c;虚拟机技术在生产力领域扮演着越来越重要的角色。Mac作为一款主流的操作系统&#xff0c;也有着运行虚拟机的能力。接下来给大家介绍Mac装虚拟机好不好&#xff0c;Mac装虚拟机和装Windows系统一样吗的具体内容。 Mac装虚拟机好不好 Mac…

Flip动画的实现示例demo

Flip动画的实现示例demo 文章说明核心代码效果展示Flip动画工具类的封装 文章说明 文章主要为了学习flip动画的实现思路&#xff0c;并且采用此示例效果来理解该实现思路的含义 参考渡一前端袁老师的讲解视频 核心代码 采用简单的y轴变化的动画效果为示例 <!DOCTYPE html>…

Spring Boot 3项目使用Swagger3教程

Spring Boot 3项目使用Swagger3教程 Swagger&#xff1a;自动生成接口文档 添加依赖(pom.xml) <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.1…

基于双向RRT算法的三维空间最优路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 单向RRT算法 4.2 双向RRT算法 5.完整程序 1.程序功能描述 基于双向RRT&#xff08;Randomly Exploring Random Trees, 随机探索随机树&#xff09;算法的三维空间最优路径规划是一种解…

Linux 文件与目录操作命令详解

文章目录 前言创建文件1. touch2. vim 文件内容显示3. cat4. more5. less6. head7. tail 文件&#xff08;目录&#xff09;复制、删除和移动8. cp9. rm10. mv 压缩文件与解压缩11. gzip12. zip 和 unzip 创建目录13. mkdir 删除目录14. rmdir 改变工作目录15. cd16. pwd 显示目…