2024-2025-1 20241316 《计算机基础与程序设计》第十三周学习总结
2024-2025-1 20241316 《计算机基础与程序设计》第十三周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第十三周作业 |
这个作业的目标 | <无> |
作业正文 | ... 本博客链接 |
教材学习内容总结
一、动态内存管理概述
- 概念解释
阐述动态内存管理的含义,即程序在运行过程中,根据实际需求来申请和释放内存空间,不像普通的变量定义那样在编译时就确定好内存大小和分配情况,这种方式能更灵活地利用内存资源,适应不同的数据规模和变化的需求。 - 必要性说明
举例说明在处理不确定数量的数据,比如从文件读取行数不定的文本内容,或者动态创建链表、树等复杂数据结构时,静态内存分配方式无法满足需求,此时就凸显出动态内存管理的重要性。
二、内存分配函数
- malloc函数
- 函数原型及参数含义:介绍
void *malloc(size_t size);
函数,其中size
参数表示要申请的内存字节数,它返回一个指向所分配内存空间起始地址的void *
类型指针,如果申请失败(比如内存不足),则返回NULL
。 - 使用示例:展示如何使用
malloc
函数申请一段内存空间来存储整数数组等简单数据结构,如int *arr = (int *)malloc(10 * sizeof(int));
用于申请能存放 10 个整数的内存区域,并通过强制类型转换将返回的void *
指针转换为合适的指针类型方便后续操作。
- 函数原型及参数含义:介绍
- calloc函数
- 函数原型及参数含义:讲解
void *calloc(size_t num, size_t size);
函数,它用于分配num
个大小为size
字节的连续内存空间,并将这块内存空间初始化为全 0,返回值同样是指向所分配内存起始地址的void *
指针,失败时返回NULL
。 - 与 malloc 对比及使用场景:对比
calloc
和malloc
的不同之处,强调calloc
初始化内存内容为 0 的特点在一些场景下的优势,例如初始化计数数组、字符串数组等,让代码更加安全可靠,减少未初始化数据带来的隐患。
- 函数原型及参数含义:讲解
- realloc函数
- 函数原型及参数含义:说明
void *realloc(void *ptr, size_t size);
函数,ptr
是之前通过malloc
、calloc
等函数分配得到的内存指针,size
是重新申请的内存字节数。该函数的作用是对已分配的内存空间进行重新调整大小,如果新申请的空间能在原内存地址基础上扩充或缩减,就直接操作原内存;若无法实现(比如原内存地址后没有足够连续空间),会另外寻找合适的内存区域,并把原内存区域的数据复制过去,然后释放原内存,最后返回新内存区域的指针,若失败则返回NULL
。 - 应用场景举例:例如当动态数组需要扩容以存放更多元素时,使用
realloc
函数来增加其内存空间,确保数据能正常存储且原有数据不丢失。
- 函数原型及参数含义:说明
三、内存释放函数
- free函数
- 函数原型及参数含义:讲解
void free(void *ptr);
函数,ptr
就是之前通过malloc
、calloc
、realloc
等分配内存函数得到且目前不再使用的内存指针,free
函数的作用是释放这块内存空间,将其归还给操作系统,让其可以被其他程序或进程再次利用。 - 注意事项:强调只能释放由动态内存分配函数分配的内存,不能释放栈上分配的变量内存(如普通函数内定义的局部变量内存),也不能对同一块内存重复释放,否则会导致程序出现错误甚至崩溃,比如内存非法访问等问题。
- 函数原型及参数含义:讲解
四、动态内存管理中的常见错误与调试
- 内存泄漏问题
解释内存泄漏的概念,即动态申请的内存空间在使用完后没有及时释放,随着程序的运行,不断地申请内存而不释放,会导致可用内存越来越少,严重时可能使整个系统内存耗尽而出现异常。举例说明在循环中动态申请内存但忘记在合适位置释放的情况,以及如何通过代码审查、工具(如一些内存检测工具)来发现和排查这类问题。 - 悬空指针问题
介绍悬空指针的产生情况,比如对已经释放的内存指针再次进行访问操作,虽然内存已经归还给操作系统了,但指针依然存在且可能被误操作,导致程序出现不可预测的行为,如读取到错误的数据、破坏内存数据等。强调在释放内存后将指针赋值为NULL
的重要性,通过合理的代码逻辑和指针赋值操作避免出现悬空指针问题。
五、动态内存与复杂数据结构
- 链表中的应用
说明在创建链表节点时,利用动态内存分配函数(如malloc
)为每个节点分配内存,以存储节点的数据和指向下一节点的指针,展示如何动态地添加、删除链表节点以及释放整个链表所占用的内存空间,体现动态内存管理在链表这种动态数据结构构建和维护中的关键作用。 - 树结构中的应用(可选内容)
如果教材涉及较深的内容,可能会介绍在树(如二叉树等)的构建过程中,同样通过动态内存分配来为每个节点开辟内存空间,根据插入、删除等操作动态调整树结构的内存占用,以及递归释放树节点内存的方法,进一步说明动态内存管理在复杂层次结构数据存储和操作方面的应用。