C语言动态内存管理中malloc,calloc,realloc,free函数介绍

Ubuntu声卡检测与故障排查:从基础命令到驱动修复 本文详细介绍了在Ubuntu系统中进行声卡检测与故障排查的完整流程。从使用lspci、aplay等基础命令识别硬件,到排查驱动冲突、修复权限问题,再到调整PulseAudio高级配置,提供了一套系统性的解决方案。文章结合实战案例,帮助用户快速诊断并解决Ubuntu系统常见的“无声”问题,恢复音频功能。 阅读详情

什么是动态内存呢?

所谓的动态内存就是程序在运行的时候,根据实际的需求动态的分配和释放内存空间,都是在内存的堆区中进行的。

下面来介绍malloc函数↓

看到函数的参数传递一个无符号整形的数字(大小是字节)扩容成功返回一个void*的指针,指向扩容内存的起始地址,在接收的时候需要强制类型转换。 扩容失败就会返回一个空指针NULL。

给出代码实例↓

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
//malloc函数
int main()
{
	//申请40个字节的空间存放10个整形
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		printf("%s\n", strerror(errno));//扩容失败打印错误信息
		return 1;
	}
	//存放1--10
	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;
}

这条代码是在堆区开辟40个字节的空间存放1-10共10个整形

下面来介绍calloc函数↓

calloc函数的第一个参数开辟几个连续的空间,第二个参数是开辟的一个空间的大小(字节)  扩容成功返回一个void*的指针,指向扩容的空间的起始地址,同样也需要在接收的时候需要强制类型转换。扩容失败也会返回一个空指针NULL。

给出代码实例↓

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
//calloc函数
int main()
{
	int* p = (int*)calloc(10, sizeof(int));//开辟10个大小为int型的内存 也一共40字节
	if (p == NULL)
	{
		perror("calloc");
		return 1;
	}
	//存放1--10
	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;
}

calloc与malloc函数的最明显的区别还是calloc开辟的空间会自动初始化而malloc不是

下面来介绍realloc函数↓

realloc函数是来调整上面两个函数所开辟的空间的开辟多了就可以释放掉多余的,开辟少了就可以增容。 函数的第一个参数是一个需要调整空间的起始地址,第二个参数是需要开辟空间的大小(字节) 注意:如果要扩容的话这里开辟的空间的大小要包含前面已经开辟的空间的大小。最后开辟失败也会返回一个空指针NULL。开辟成功会返回要被调整空间的起始地址。

realloc函数开辟空间有两种情况:

1.后面有足够的空间可以扩容直接在后边续上新的空间的地址,返回旧的起始地址。

2.当后面没有足够的空间可以扩容, realloc函数就会找一个满足空间大小的新的连续空间,把旧的空间的数据,拷贝新空间的前面位置,并且把旧的空间释放掉,同时返回新的空间的起始地址。

给出代码解释 同样是开辟10个整形的空间放1-10的数字

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
//realloc函数
int main()
{
	int* p = (int*)malloc(5 * sizeof(int));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		*(p + i) = i + 1;
	}
	//再加五个整形空间
	int* ptr = (int*)realloc(p, 10 * sizeof(int));
	if (ptr != NULL)
	{
		p = ptr;
	}
	//继续使用空间
	for (i = 5; i < 10; i++)
	{
		*(p + i) = i + 1;
	}
	//打印
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

这里就有一个疑问了为什么realloc函数返回的地址要用一个新的指针变量ptr接收 而不用原来的p , 但后面到了又将p的地址赋给了ptr 这不多此一举吗? 其实没有的,其实从代码中就能知道if语句判断ptr不为NULL,这一步就是以防万一realloc函数扩容失败的情况下返回NULL,如果用p来接收的话 p的内容就会被赋值为NULL,原来p指向的内容同时也会丢失。

最后是free函数 

free函数是将开辟的内存释放掉 参数就是要被释放掉内存的地址 释放掉内存 指针变量会变成野指针 需要将其初始化为NULL。

有人就要问:程序结束的时候不是把所有的内存都释放掉吗, 这不是多此一举吗?

其实在我上述代码中会显得多此一举 但是代码如果有上百行千行,中间要扩容内存,如果没有及时释放掉就会造成很多问题。

以下是一些常见的问题:

1.内存泄漏:这是最直接的后果。每次动态分配的内存块如果不释放,随着程序运行,这些未释放的内存会不断积累。可用内存会越来越少,最终可能导致系统内存耗尽,程序因无法分配到足够内存而崩溃,或者其他程序因缺乏内存而无法正常运行。
2.性能下降:操作系统管理内存时,需要维护内存分配和释放的相关数据结构。大量未释放的内存会使这些数据结构变得复杂,增加内存管理的开销,从而影响程序的运行效率。例如,在频繁分配和不释放内存的情况下,内存碎片问题会更加严重,导致后续即使有足够的总内存,也可能无法分配出连续的足够大的内存块来满足需求。
3.程序稳定性降低:内存泄漏可能导致程序出现难以调试和定位的错误。由于可用内存不断减少,程序在运行过程中可能会因为内存不足而出现异常行为,如访问非法内存地址、程序崩溃等,而且这些错误可能在程序运行一段时间后才出现,增加了排查和修复的难度。

 

 

以太网以及车载以太网概述 千兆网线和百兆网线区别 1、所谓的百兆网线其实就是 五类线 和超五类线 ,而千兆网线主要是指六类线 和超六类线 ,另外还有古老的十兆网线也就是指 四类线 和 三类线 等。 2、在使用上,其实千兆网线和百兆网线是没什么区别的,千兆网线完全兼容百兆网络。 3、百兆网线的线芯是8芯,但上传和下载只用到了其中的4根,而千兆网线需要完全用到8根。 4、另外在线芯的排布上,千兆网线的线芯中间有个十字形的塑料架,用来把四组8芯的线分开,这个百兆网线是没有的, 5、所有的网线在外皮上都有种类标识,CAT5 CAT 阅读详情

相关推荐

PC微信(3.9.2.23)逆向实战:定位并Hook消息接收函数

本文详细介绍了PC微信(3.9.2.23)逆向分析中定位并Hook消息接收函数的完整实战流程。通过Cheat Engine动态定位未读消息数内存地址,结合OllyDbg分析代码上下文,最终找到稳定的Hook点,并分享了实战中的关键注意事项与踩坑经验。

lll78的博客 473

初学C语言——malloc动态开辟内存空间

初学C语言——malloc动态开辟内存空间

qq_65305227的博客 873

DOTS 性能基石:为什么传统 Unity 代码难以满足现代游戏需求?(DOTS 系列教程 · 第1篇)

本文探讨了Unity游戏开发中的性能优化问题,指出性能问题不应在最后才考虑,而应贯穿整个开发过程。文章分析了性能问题的三大表现(渲染开销、物理模拟、游戏逻辑),并解释了依赖硬件升级的不可行性。重点剖析了传统Unity代码性能低下的六大根源:垃圾回收卡顿、编译器优化不足、多核利用不足、数据结构和代码缓存不友好、过度抽象等问题。最后指出Unity项目中常见的反模式,如主线程垄断、内存碎片化等,为后续学习DOTS高性能架构解决方案奠定基础。

分享知识,拥抱变化 151

C语言——动态内存函数(malloc、calloc、realloc、free)

快速学习动态内存函数

plj521的博客 5503

【软考高级架构】论文范文16——论分布式缓存架构设计及其应用

随着互联网业务的快速发展,高并发访问和海量数据处理对系统响应时间提出了极高要求,传统基于磁盘的数据库存储已难以满足毫秒级的性能需求。分布式缓存作为一种高性能、可扩展的数据存储中间件,能够有效减轻后端数据库压力、加速热点数据访问、提升系统吞吐量,已成为高并发系统架构中的核心组件。本文以笔者主导的某大型电商平台秒杀系统建设项目为案例,围绕分布式缓存架构设计展开论述。笔者担任系统架构师,主导了缓存选型、数据分片策略、缓存一致性方案、高可用架构及缓存穿透/雪崩/击穿防护机制的设计与落地。

qq837993702的博客 163

【大模型】AI 辅助编程操作实战使用详解

AI 编程实战使用详解

congge 8461

【C语言】动态内存实现通讯录(malloc,calloc,realloc)

通讯录可以灵活的开辟空间。malloc,calloc,realloc的使用

qq_27183803的博客 2524

【学习系列】SAP RAP 7:行为定义-Draft

本文介绍了RAP框架中的草稿表(Draft)功能及其应用。草稿表允许用户临时保存数据,在激活前不影响业务逻辑,支持保存继续、暂存和设备切换功能。草稿分为独占草稿(仅限同一用户编辑)和协作草稿(允许多用户协同编辑)。启用草稿需在行为定义和投影中包含标准action,并创建包含TotalETag等管理字段的草稿表。TotalETag确保草稿转换时活动数据未被修改,而ETagmaster则防止并发修改。文章通过OData调用示例详细说明了ETag验证过程,强调草稿功能由RAP框架自动处理,开发者只需关注定义和配置

DeveloperMrMeng的博客 443

calloc()和realloc()的用法详解

calloc()和realloc()的用法详解

LM0624的博客 1250

isaaclab无法识别NVIDIA显卡,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1146

EXCEL VBA从入门到精通 前言

本书通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程,同时也介绍了常用的工具、资源、社区和协作平台等,方便读者进行进一步的学习和开发。我强烈推荐这本书给所有希望学习和掌握Excel VBA编程的读者。多样化的资源和工具介绍:本书介绍了丰富的工具和资源,包括官方文档、在线教程、代码库、论坛、博客等,方便读者进行进一步的学习和开发。详细的讲解和丰富的示例:本书从语法和对象开始讲解,通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程。第一节:什么是VBA 5。

1729

动态内存函数malloc,calloc,realloc详解

动态内存函数malloc,calloc,realloc,free详解

qq_41934502的博客 7784

手把手教你学AutoSAR - 总目录

鉴于近期较多博友问及微信群,如下可申请好友验证,请备注“autosar”,否则可能添加不通过。验证通过后,拉入讨论群。PS:本人鉴于工作事项可能不能及时回复问题,可在交流群内部和其他博友之间相互沟通交流经验。欢迎来到桃源乐游的《AutoSAR配置与实践》,以下为学习大纲,蓝色字体点击可跳转。

nihaoljq2010的博客 7459

【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍

C语言动态内存管理malloc,calloc,realoc,free函数的介绍和使用

2301_77900444的博客 1608

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等的介绍

C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等的介绍malloc 函数需要引入头文件 C语言提供了一个动态内存开辟的函数:这个函数向内存申请了一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候。

Farewell_me的博客 1344

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C 语言动态内存管理malloc 函数calloc函数realloc函数,free函数

C语言提供的动态内存开辟的函数 文章目录C语言提供的动态内存开辟的函数前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(

Alicesa的博客 348

C语言中动态内存管理详解:malloc、calloc、realloc和free函数用法解析

我们将详细介绍每个函数的用法,并通过一些示例说明它们在实际编程中的应用。该函数接受一个参数,即指向需要释放的内存块起始地址的指针。该函数接受两个参数,即需要分配的元素个数和每个元素的大小,以字节为单位。函数用于动态分配内存空间,返回分配的内存块的起始地址。它的返回值是分配的内存块的起始地址。函数用于重新分配已分配内存空间的大小,返回重新分配后的内存块的起始地址。在释放内存后,不要再访问已释放的内存块,否则会导致未定义的行为。函数时,要注意处理分配失败的情况,避免内存分配失败的风险。

2201_75437633的博客 1074

C语言动态内存管理malloc、calloc、realloc、free函数的讲解

关于动态内存函数malloc、calloc、realloc、free函数的详解过程

hffh123的博客 686

C语言动态内存管理函数(malloc、calloc、realloc 和 free)

C语言动态内存管理函数的使用以及使用动态分配内存函数时需要注意的细节。

指尖动听知识库 137

c语言:深入理解动态内存管理(了解malloc,calloc,realloc,free函数的用法)

c语言:深入理解动态内存管理(了解malloc,calloc,realloc,free函数的用法)

2303_80025768的博客 428

动态内存管理函数 malloc/free/calloc/realloc - C语言

定义:分配内存块。头文件:注:这个函数向内存申请一块的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数size为0malloc的行为是标准是未定义的,取决于编译器。定义:回收/释放内存块头文件:

m0_73969113的博客 282

C语言中动态内存管理函数malloc(),calloc(),realloc(),free()函数及其常见使用错误详解

C语言中动态内存管理函数malloc(),calloc(),realloc(),free()函数及其常见使用错误详解

Cxz_learn_C的博客 828

C语言动态内存管理:malloc、realloc、calloc以及free函数

我们已经掌握的内存开辟方式有: int val = 20;//在栈空间上开辟四个字节 char arr[10] = {0};//在栈空间上开辟10个字节的连续空间 但是这种开辟空间的方式有两个特点: 1. 空间开辟的大小是固定的。 2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。 但是我们在实际的需求中,对于空间的需求,不仅仅是上述的情况。有时候我...

小心眼儿猫的博客 911

C语言malloc函数详情与动态内存管理原理实现(malloc、realloc、calloc和free完整实现)

本文深入解析了嵌入式实时系统中TLSF(两级分离适配)内存管理算法的原理与实现。TLSF通过两级索引架构(32档第一级索引和8个子区间第二级索引)实现O(1)时间复杂度的内存分配/释放,解决了传统分配器时间不确定和内存碎片严重的问题。其核心设计包括:位图加速查找(固定40次位运算)、物理邻接指针实现O(1)合并、即时碎片整理机制。实测显示在Cortex-M3平台,TLSF最坏情况分配时间仅2.8μs,而标准库在碎片严重时可达450μs。代码实现约500行,支持线程安全封装和原地扩展优化,适用于资源受限的嵌入

2601_95882051的博客 8497

【C语言】动态内存管理四大常用函数--malloc,calloc,realloc,free以及动态内存管理的常见问题

动态内存管理的主要函数有malloc,calloc,realloc,free等,这些函数操作的数据都是在堆区上的,我们的内存分为了栈区,堆区,静态区,栈区主要用来存放局部变量和形式参数,堆区主要是用于动态内存开辟,静态区主要存放的是全局变量和static修饰的变量也即静态变量。

2301_76771985的博客 1294

【C语言】动态内存管理全解析:malloc、calloc、realloc与free的正确使用

本文深入讲解C语言动态内存分配的四大函数:malloc、calloc、realloc和free。首先分析静态内存分配的局限性,指出动态内存分配的必要性。重点介绍了malloc函数的使用注意事项及其配套的free函数的安全释放方法,强调必须检查返回指针是否为NULL。随后对比calloc与malloc的区别,说明calloc会自动初始化内存为0。最后详细解析realloc的两种扩展情况及其正确使用方法,特别提醒realloc返回新指针的安全处理方式。文章通过代码示例演示了各函数的正确使用方式,并总结了内存管理

suxi_na的博客 1596

【C语言】—— 动态内存管理

摘要

yusjushd的博客 1816
上一篇: C语言中结构体的内存对齐
下一篇: java中的方法(函数)重载
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值