C语言动态分配内存ppt课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
free函数
释放一块动态分配的内存: 例如: int *p; p = (int *)malloc(sizeof(int)); free(p);
13
需要注意的问题
(1)free函数同样是一个库函数 (2)free函数的参数必须是一个由动态内存分
配方法分配的内存块的首地址(使用malloc 函数分配的内存)
4
malloc函数
例1:使用malloc函数分配一个可以容纳10 个整型元素的内存空间,并将其用作一个 整型数组
5
关键代码: int * array;
malloc函数
array = (int *)malloc(10 * sizeof(int));
注意:内存大小不能写成数组元素的个数
6
malloc函数
10
需要注意的问题
(3)内存块大小的可移植性问题
• 分配一个整型变量数组应使用: 数组元素个数 * sizeof(int) 确定内存块的大小
问题:sizeof和strlen函数的区别
11
free函数
free函数原型: void free(void * p); p是要释放的已分配内存的块的首地址
12
8
需要注意的问题
(1)malloc函数是一个库函数,它并不是C语 言中的关键字:
• 需要头文件<stdlib.h>才可以使用该函数
• 并不是所有的平台都可以使用该函数,尤 其是一些单片机系统
9
需要注意的问题
(2)指针类型转换是必须的,关系到接收分配 好的内存块的地址可以向前看多少字节。
• 如果不做指针类型转换会怎么样? • void * 指针存在的意义。
C语言动态分配内存
1 动态内存分配基础 2 动态内存分配实例 3 动态内存分配进阶
1
动态分配内存基础
2
动态分配内存概述
• 什么时候需要动态分配内存? • 实例:顺序对一批文件进行解析,但是不
知道文件的大小,如何建立缓冲区?
3
malloc函数
malloc函数原型: void * malloc(size_t n); n是要分配的内存的大小,返回值是分配内 存的块的首地址
14
动态分配内存特点
• 内存空间大小可以是一个变量,其值在运 行时确定
• 内存空间在运行时分配,在程序结束时收 回;内存的分配由操作系统参与完成
• 动态分配的内存空间在未释放之前均可以 被引用,保证其生命期
15
链表
16
链表的概述
struct node {
int node; /* 数据域,存储结点的值 */ struct node * next; };
23
实例关键点分析
结点结构: struct info{
char name[10]; int id; int score; }; struct std{ struct info; struct std * next; };
24
实例关键点分析
main函数: int main(void) {
/* 初始化学生链表 */ /* 插入一个学生信息结点 */ /* 删除一个学生的信息,并且打印 */ return 0; }
28
综合实例
两个扩展函数:
(1)实现一个链表排序函数,使用冒泡排序 的方法。
(2)遍历一个链表,找到链表的中点节点。 (3)寻找某一个节点之前的那个节点
29
类malloc函数
• calloc函数 void *calloc( size_t num, size_t size );
• relloc函数 void *realloc(void *mem_address, unsigned int newsize);
/* 根据id找到该学生的信息结点 */ /* 将该结点从链表上取下 */ /* 使用res保存该节点 */ /* 释放该结点所占用的内存 */ return 1; /* 成功操作返回1 */ }
27
综合实例
(1)实现print函数对其遍历打印链表 (2)实现destroy函数释放每一个链表节点 (3)实现search函数查找链表中的元素 (4)实现一个升级版的insert将元素按顺 序插入 (5)实现一个升级版的search函数按顺序 查找 (6)实现get_count函数得到链表元素个数
17
链表示意图
value 1
value 2
value 3
value N4ULL
18
处理链表使用的 函数
• 动态申请内存:void * malloc(size_t n); • 释放动态内存:void free(void *);
19
插入一个结点
struct node *p = &b; a.next = p; /* 连接a结点和b结点 */ b.next = &c; /* 连接b结点和c结点 */
20
删除一个结点
struct node *p = &b; a.next = b.next; /* 连接a结点和c结点 */ free(p); /* 摘下的b结点一定要释放掉*/
21
动态内存分配实例
22
动态内存分配实例
设计一个学生链表,其每个结点是一个学 生信息的集合。每个结点包含如下信息: 学生姓名、学号、C语言成绩三项。初始时 拥有3个学生,添加一个学生(使用一个函数 实现此操作),再删除一个学生(使用另一个 函数实现此操作),并打印该学生的信息。
25
实例关键点分析
int insert(char * name, int id, int score) {
/* 分配一个struct std结构对象 */ /* 将参数赋值到结构对应的成员中 */
return 1; /* 正确完成操作,返回1 */
}
26
实例关键点分析
int remove(int id, struct std ** res) {
30
综合实例
实现一个可变的数组,从一个键盘输入若 干个数字,以-1结尾。并将其逆序输出。
提示:作为数组的缓冲区的大小是固定的, 当读取的数字的数目超过数组大小的时候 需要使用realloc函数扩展缓冲区数组。
例2:定义一个结构 struct test{ int a; char b; int c[10]; };
使用malloc函数分配一个此种结构类型的对 象
7பைடு நூலகம்
malloc函数
关键代码: struct test * p; p = (struct test *)malloc(sizeof(struct test));