C语言动态分配内存课件.ppt
《C语言动态分配内存课件.ppt》由会员分享,可在线阅读,更多相关《C语言动态分配内存课件.ppt(62页珍藏版)》请在三一办公上搜索。
1、1动态内存分配基础2动态内存分配实例3动态内存分配进阶,C语言动态分配内存,1,t课件,动态分配内存基础,2,t课件,动态分配内存概述,什么时候需要动态分配内存?实例:顺序对一批文件进行解析,但是不知道文件的大小,如何建立缓冲区?,3,t课件,malloc函数,malloc函数原型:void * malloc(size_t n);n是要分配的内存的大小,返回值是分配内存的块的首地址,4,t课件,malloc函数,例1:使用malloc函数分配一个可以容纳10个整型元素的内存空间,并将其用作一个整型数组,5,t课件,malloc函数,关键代码:int * array;array = (int *
2、)malloc(10 * sizeof(int);注意:内存大小不能写成数组元素的个数,6,t课件,malloc函数,例2:定义一个结构struct testint a;char b;int c10;使用malloc函数分配一个此种结构类型的对象,7,t课件,malloc函数,关键代码:struct test * p;p = (struct test *)malloc(sizeof(struct test);,8,t课件,需要注意的问题,(1)malloc函数是一个库函数,它并不是C语言中的关键字:需要头文件才可以使用该函数并不是所有的平台都可以使用该函数,尤其是一些单片机系统,9,t课件,需
3、要注意的问题,(2)指针类型转换是必须的,关系到接收分配好的内存块的地址可以向前看多少字节。如果不做指针类型转换会怎么样?void * 指针存在的意义。,10,t课件,需要注意的问题,(3)内存块大小的可移植性问题分配一个整型变量数组应使用:数组元素个数 * sizeof(int)确定内存块的大小问题:sizeof和strlen函数的区别,11,t课件,free函数,free函数原型:void free(void * p);p是要释放的已分配内存的块的首地址,12,t课件,free函数,释放一块动态分配的内存:例如:int *p;p = (int *)malloc(sizeof(int);fr
4、ee(p);,13,t课件,需要注意的问题,(1)free函数同样是一个库函数(2)free函数的参数必须是一个由动态内存分配方法分配的内存块的首地址(使用malloc函数分配的内存),14,t课件,动态分配内存特点,内存空间大小可以是一个变量,其值在运行时确定内存空间在运行时分配,在程序结束时收回;内存的分配由操作系统参与完成动态分配的内存空间在未释放之前均可以被引用,保证其生命期,15,t课件,链表,16,t课件,链表的概述,struct node int node; /* 数据域,存储结点的值 */struct node * next;,17,t课件,链表示意图,value1,value
5、 2,value 3,value 4,NULL,18,t课件,处理链表使用的函数,动态申请内存:void * malloc(size_t n);释放动态内存:void free(void *);,19,t课件,插入一个结点,struct node *p = /* 连接b结点和c结点 */,20,t课件,删除一个结点,struct node *p = /* 摘下的b结点一定要释放掉*/,21,t课件,动态内存分配实例,22,t课件,动态内存分配实例,设计一个学生链表,其每个结点是一个学生信息的集合。每个结点包含如下信息:学生姓名、学号、C语言成绩三项。初始时拥有3个学生,添加一个学生(使用一个函
6、数实现此操作),再删除一个学生(使用另一个函数实现此操作),并打印该学生的信息。,23,t课件,实例关键点分析,结点结构:struct infochar name10;int id;int score;struct stdstruct info;struct std * next;,24,t课件,实例关键点分析,main函数:int main(void)/* 初始化学生链表 */* 插入一个学生信息结点 */* 删除一个学生的信息,并且打印 */return 0;,25,t课件,实例关键点分析,int insert(char * name, int id, int score)/* 分配一个s
7、truct std结构对象 */* 将参数赋值到结构对应的成员中 */return 1; /* 正确完成操作,返回1 */,26,t课件,实例关键点分析,int remove(int id, struct std * res)/* 根据id找到该学生的信息结点 */* 将该结点从链表上取下 */* 使用res保存该节点 */* 释放该结点所占用的内存 */return 1; /* 成功操作返回1 */,27,t课件,综合实例,(1)实现print函数对其遍历打印链表(2)实现destroy函数释放每一个链表节点(3)实现search函数查找链表中的元素(4)实现一个升级版的insert将元素按
8、顺序插入(5)实现一个升级版的search函数按顺序查找(6)实现get_count函数得到链表元素个数,28,t课件,综合实例,两个扩展函数:(1)实现一个链表排序函数,使用冒泡排序的方法。(2)遍历一个链表,找到链表的中点节点。(3)寻找某一个节点之前的那个节点,29,t课件,类malloc函数,calloc函数void *calloc( size_t num, size_t size ); relloc函数void *realloc(void *mem_address, unsigned int newsize);,30,t课件,综合实例,实现一个可变的数组,从一个键盘输入若干个数字,以
9、-1结尾。并将其逆序输出。提示:作为数组的缓冲区的大小是固定的,当读取的数字的数目超过数组大小的时候需要使用realloc函数扩展缓冲区数组。,31,t课件,综合实例,实现一个realloc函数,32,t课件,动态内存分配进阶,深入理解动态分配内存的内部机制,33,t课件,堆和栈,代码段,数据段,环境变量和命令行参数,栈,堆,进程地址空间,34,t课件,malloc函数的机制,分配原则最先适合分配方法malloc内部调用sbrk()系统调用一个进程使用一个堆,所有内存由操作系统管理问题:如果申请一个内存并没有释放,当进程结束运行的时候,会造成内存泄露么吗?,35,t课件,malloc函数的实现
10、,内存控制块结构定义:structmem_control_blockintis_available; /* 该块是否可用 */intsize; /* 该块的大小 */;,36,t课件,malloc函数的实现,两个重要的全局变量堆底,分配块的第一块:void*managed_memory_start;堆顶,分配块的最后一块void*last_valid_address;,37,t课件,malloc代码分解,函数的参数:void*malloc(longnumbytes)numbytes是要申请的字节数,但是并不包括内存控制块结构,也就是说我们实际需要的空间是numbytes + sizeof(st
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 动态分配 内存 课件
链接地址:https://www.31ppt.com/p-1480401.html