版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、整理ppt11动态内存分配基础2动态内存分配实例3动态内存分配进阶C语言动态分配内存整理ppt2动态分配内存基础整理ppt3动态分配内存概述什么时候需要动态分配内存?实例:顺序对一批文件进行解析,但是不知道文件的大小,如何建立缓冲区?整理ppt4malloc函数malloc函数原型:void * malloc(size_t n);n是要分配的内存的大小,返回值是分配内存的块的首地址 整理ppt5malloc函数例1:使用malloc函数分配一个可以容纳10个整型元素的内存空间,并将其用作一个整型数组整理ppt6malloc函数关键代码:int * array;array = (int *)ma
2、lloc(10 * sizeof(int);注意:内存大小不能写成数组元素的个数整理ppt7malloc函数 例2:定义一个结构struct testint a;char b;int c10;使用malloc函数分配一个此种结构类型的对象整理ppt8malloc函数 关键代码:struct test * p;p = (struct test *)malloc(sizeof(struct test);整理ppt9需要注意的问题(1)malloc函数是一个库函数,它并不是C语言中的关键字:需要头文件才可以使用该函数并不是所有的平台都可以使用该函数,尤其是一些单片机系统整理ppt10需要注意的问题(
3、2)指针类型转换是必须的,关系到接收分配好的内存块的地址可以向前看多少字节。如果不做指针类型转换会怎么样?void * 指针存在的意义。整理ppt11需要注意的问题(3)内存块大小的可移植性问题分配一个整型变量数组应使用:数组元素个数 * sizeof(int)确定内存块的大小问题:sizeof和strlen函数的区别整理ppt12free函数free函数原型:void free(void * p);p是要释放的已分配内存的块的首地址整理ppt13free函数释放一块动态分配的内存:例如:int *p;p = (int *)malloc(sizeof(int);free(p);整理ppt14需
4、要注意的问题(1)free函数同样是一个库函数(2)free函数的参数必须是一个由动态内存分配方法分配的内存块的首地址(使用malloc函数分配的内存)整理ppt15动态分配内存特点内存空间大小可以是一个变量,其值在运行时确定内存空间在运行时分配,在程序结束时收回;内存的分配由操作系统参与完成动态分配的内存空间在未释放之前均可以被引用,保证其生命期整理ppt16链表整理ppt17链表的概述 struct node int node; /* 数据域,存储结点的值 */struct node * next;整理ppt18链表示意图value1value 2value 3value 4NULL整理p
5、pt19处理链表使用的函数动态申请内存:void * malloc(size_t n);释放动态内存:void free(void *); 整理ppt20插入一个结点 struct node *p = &b;a.next = p; /* 连接a结点和b结点 */ b.next = &c; /* 连接b结点和c结点 */整理ppt21删除一个结点 struct node *p = &b;a.next = b.next; /* 连接a结点和c结点 */ free(p); /* 摘下的b结点一定要释放掉*/ 整理ppt22动态内存分配实例整理ppt23动态内存分配实例设计一个学生链表,其每个结点是一
6、个学生信息的集合。每个结点包含如下信息:学生姓名、学号、C语言成绩三项。初始时拥有3个学生,添加一个学生(使用一个函数实现此操作),再删除一个学生(使用另一个函数实现此操作),并打印该学生的信息。整理ppt24实例关键点分析结点结构:struct infochar name10;int id;int score;struct stdstruct info;struct std * next;整理ppt25实例关键点分析main函数:int main(void)/* 初始化学生链表 */* 插入一个学生信息结点 */* 删除一个学生的信息,并且打印 */return 0;整理ppt26实例关键点
7、分析int insert(char * name, int id, int score)/* 分配一个struct std结构对象 */* 将参数赋值到结构对应的成员中 */return 1; /* 正确完成操作,返回1 */整理ppt27实例关键点分析int remove(int id, struct std * res)/* 根据id找到该学生的信息结点 */* 将该结点从链表上取下 */* 使用res保存该节点 */* 释放该结点所占用的内存 */return 1; /* 成功操作返回1 */ 整理ppt28综合实例(1)实现print函数对其遍历打印链表(2)实现destroy函数释放
8、每一个链表节点(3)实现search函数查找链表中的元素(4)实现一个升级版的insert将元素按顺序插入(5)实现一个升级版的search函数按顺序查找(6)实现get_count函数得到链表元素个数整理ppt29综合实例两个扩展函数:(1)实现一个链表排序函数,使用冒泡排序的方法。(2)遍历一个链表,找到链表的中点节点。(3)寻找某一个节点之前的那个节点整理ppt30类malloc函数calloc函数void *calloc( size_t num, size_t size ); relloc函数void *realloc(void *mem_address, unsigned int n
9、ewsize); 整理ppt31综合实例实现一个可变的数组,从一个键盘输入若干个数字,以-1结尾。并将其逆序输出。提示:作为数组的缓冲区的大小是固定的,当读取的数字的数目超过数组大小的时候需要使用realloc函数扩展缓冲区数组。整理ppt32综合实例实现一个realloc函数整理ppt33动态内存分配进阶深入理解动态分配内存的内部机制整理ppt34堆和栈代码段数据段环境变量和命令行参数栈堆进程地址空间整理ppt35malloc函数的机制分配原则最先适合分配方法malloc内部调用sbrk()系统调用一个进程使用一个堆,所有内存由操作系统管理问题:如果申请一个内存并没有释放,当进程结束运行的时
10、候,会造成内存泄露么吗?整理ppt36malloc函数的实现内存控制块结构定义:struct mem_control_block int is_available; /* 该块是否可用 */ int size; /* 该块的大小 */; 整理ppt37malloc函数的实现两个重要的全局变量堆底,分配块的第一块:void *managed_memory_start;堆顶,分配块的最后一块void *last_valid_address; 整理ppt38malloc代码分解函数的参数:void *malloc(long numbytes) numbytes是要申请的字节数,但是并不包括内存控制块
11、结构,也就是说我们实际需要的空间是numbytes + sizeof(struct mem_control_block)整理ppt39malloc代码分解几个重要的局部变量:void *current_location; struct mem_control_block *current_location_mcb;void *memory_location;整理ppt40malloc代码分解重要的语句:numbytes = numbytes + sizeof(struct mem_control_block); /* 得到完整的需要空间,用户需要的空间 + 内存控制块结构 */current_
12、location = managed_memory_start; /* 从内存块队列的头开始遍历整个内存队列 */整理ppt41malloc代码分解while(current_location != last_valid_address) while(current_location != last_valid_address) current_location_mcb = current_location_mcb = (struct mem_control_block(struct mem_control_block * *)current_location; )current_locati
13、on; if(current_location_mcb-is_available)if(current_location_mcb-is_available) if(current_location_mcb-size = numbytes)if(current_location_mcb-size = numbytes) current_location_mcb-current_location_mcb-is_available = 0;is_available = 0; memory_location = current_location;memory_location = current_lo
14、cation; break; break; current_location = current_location + current_location = current_location + current_location_mcb-size;current_location_mcb-size; 整理ppt42malloc代码分解如果现有的内存块不能满足需要:if(! memory_location) sbrk(numbytes); memory_location = last_valid_address; last_valid_address = last_valid_address +
15、 numbytes; current_location_mcb = memory_location; current_location_mcb-is_available = 0; current_location_mcb-size = numbytes;整理ppt43malloc代码分解memory_location = memory_location + sizeof(struct mem_control_block); /* 返回给用户可用内存的地址,跳过内存控制块结构 */ return memory_location; /* 返回 */ 整理ppt44sbrk系统调用malloc代码大
16、部分都由库来完成,为什么还要有这个系统调用?这个系统调用做了什么?为什么只有内存增加的时候需要系统干预?现代操作系统的存储机制整理ppt45free函数的实现void free(void *firstbyte)struct mem_control_block *mcb;mcb = firstbyte -sizeof(struct mem_control_block); mcb-is_available = 1; /* 这一步是最关键的 */return; 整理ppt46free机制总结并不是真正的释放,只是将内存块标记为可用。问题1:释放内存后,系统显示的可用内存数会发生改变吗?问题2:释放的
17、内存还可以引用吗?整理ppt47非常规使用(1)当申请0个字节时会出现什么情况例如:int *p;p = (int *)malloc(0);(2)释放一个非动态内存申请的空间例如:int array10, *p;p = array; free(p);整理ppt48两种内存分配的比较动态分配内存和非动态分配内存的比较动态分配内存动态分配内存非动态分配内存非动态分配内存大小在编译时确定大小在运行时确定由编译器分配由操作系统参与分配分配在数据段和栈内在堆内由操作系统自动释放手动显式释放整理ppt49memset函数概念如果需要将一块内存设置为同一个值的时候,需要使用memset函数。例如:分配一个缓
18、冲区,将该缓冲区内的值清零整理ppt50memset函数原形void memset(void *s, int n, size_t size);s:需要设置内存的首地址n:需要被设置的值size:需要设置的字节数整理ppt51memset函数实例#include int main()char s10;memset(void *)s, a, 10);s10 = 0;printf(“%sn”, s);return 0; 输出结构为:aaaaaaaaa整理ppt52综合实例使用memset函数和malloc函数实现一个calloc函数整理ppt53memset函数实例#include int main
19、()char s10;memset(void *)s, a, 10);s10 = 0;printf(“%sn”, s);return 0; 输出结构为:aaaaaaaaa整理ppt54memcpy函数概念当需要在两块内存之间进行数据拷贝的时候需要使用memcpy函数其原形为:void * memcpy(void *dest, const void * src, size_t n);dest:复制到目的地址src:复制的源地址n:需要复制的字节数整理ppt55memcpy函数实例#include int main()char s = “hello”, d10;memcpy(d, s, 5);d5
20、 = 0;printf(“%s”, d);return 0;运行结果:hello整理ppt56替代函数void bzero(void *s, size_t n);void bcopy(void * dest, const void * src, size_t n);整理ppt57其它内存块操作的函数memccpy(拷贝内存内容) 定义函数 void * memccpy(void *dest, const void * src, int c,size_t n);函数说明 memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不同的是,memccpy()会在复制时检查参数c是否出现,若是则返回dest中值为c的下一个字节地址。返回值为0表示在src所指内存前n个字节中没有值为c的字节。整理ppt58 其它内存块操作的函数memcmp(比较内存内容) 相关函数 bcmp,定义函数 int memcmp (const void *s1,const void *s2,size_t n);函数说明 memcmp()用来比较s1和s2所指的内存区间前n个字符。字符串大小的比较是以ASCII码表上的顺序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《糖尿病伴低钾血症》课件
- 赣州师范高等专科学校《路桥施工技术》2023-2024学年第一学期期末试卷
- 赣南师范大学《机械工程测试技术英》2023-2024学年第一学期期末试卷
- 赣南科技学院《锅炉原理课程设计》2023-2024学年第一学期期末试卷
- 《克隆与治疗性克隆》课件
- 甘孜职业学院《数字影像工程》2023-2024学年第一学期期末试卷
- 七年级道德与法治上册第一单元成长的节拍第三课发现自己第一框认识自己教案新人教版
- 《微小世界和我们》课件
- git内部培训课件
- 中学生交通安全教育
- DL-T5704-2014火力发电厂热力设备及管道保温防腐施工质量验收规程
- 贵州省黔东南州2022-2023学年八年级上学期期末文化水平测试数学试卷(含答案)
- 九年级数学特长生选拔考试试题
- 幼儿园交通安全宣传课件PPT
- 门窗施工组织设计与方案
- 健身健美(课堂PPT)
- (完整版)财务管理学课后习题答案-人大版
- 锚索试验总结(共11页)
- 移动脚手架安全交底
- 人教版“课标”教材《统计与概率》教学内容、具体目标和要求
- 矩形钢板水箱的设计与计算
评论
0/150
提交评论