语言动态分配内存演示文稿.pptVIP

  • 0
  • 0
  • 约4.78千字
  • 约 61页
  • 2026-01-30 发布于山东
  • 举报

实例关键点分析 intinsert(char*name,intid,intscore) { /*分配一个structstd结构对象*/ /*将参数赋值到结构对应的成员中*/ return1;/*正确完成操作,返回1*/ }第27页,共61页。 实例关键点分析 intremove(intid,structstd**res) { /*根据id找到该学生的信息结点*/ /*将该结点从链表上取下*/ /*使用res保存该节点*/ /*释放该结点所占用的内存*/ return1;/*成功操作返回1*/ }第28页,共61页。 综合实例 (1)实现print函数对其遍历打印链表 (2)实现destroy函数释放每一个链表节点 (3)实现search函数查找链表中的元素 (4)实现一个升级版的insert将元素按顺序插入 (5)实现一个升级版的search函数按顺序查找 (6)实现get_count函数得到链表元素个数第29页,共61页。 综合实例 两个扩展函数:(1)实现一个链表排序函数,使用冒泡排序的方法。(2)遍历一个链表,找到链表的中点节点。(3)寻找某一个节点之前的那个节点第30页,共61页。 类MALLOC函数calloc函数 void*calloc(size_tnum,size_tsize);relloc函数 void*realloc(void*mem_address,unsignedintnewsize);第31页,共61页。 综合实例 实现一个可变的数组,从一个键盘输入若干个数字,以-1结尾。并将其逆序输出。 提示:作为数组的缓冲区的大小是固定的,当读取的数字的数目超过数组大小的时候需要使用realloc函数扩展缓冲区数组。第32页,共61页。 综合实例 实现一个realloc函数第33页,共61页。动态内存分配进阶深入理解动态分配内存的内部机制第34页,共61页。 堆和栈代码段数据段环境变量和命令行参数栈堆进程地址空间第35页,共61页。 MALLOC函数的机制分配原则——最先适合分配方法malloc内部调用sbrk()系统调用一个进程使用一个堆,所有内存由操作系统管理 问题:如果申请一个内存并没有释放,当进程结束运行的时候,会造成内存泄露么吗?第36页,共61页。 MALLOC函数的实现 内存控制块结构定义: struct?mem_control_block?{

????int?is_available;/*该块是否可用*/

????int?size;/*该块的大小*/

};第37页,共61页。 MALLOC函数的实现 两个重要的全局变量 堆底,分配块的第一块: void?*managed_memory_start; 堆顶,分配块的最后一块

void?*last_valid_address;第38页,共61页。 MALLOC代码分解 函数的参数: void?*malloc(long?numbytes)?{

…… } numbytes是要申请的字节数,但是并不包括内存控制块结构,也就是说我们实际需要的空间是numbytes+sizeof(struct?mem_control_block)第39页,共61页。 MALLOC代码分解 几个重要的局部变量: void?*current_location; struct?mem_control_block?*current_location_mcb;

void?*memory_location;

第40页,共61页。 MALLOC代码分解 重要的语句: numbytes?=?numbytes?+?sizeof(struct?mem_control_block);/*得到完整的需要空间,用户需要的空间+内存控制块结构*/

current_location?=?managed_memory_start;/*从内存块队列的头开始遍历整个内存队列*/

第41页,共61页。 MALLOC代码分解while(current_location?!=?last_valid_address){ current_location_mcb?=(struct?mem_control_block?*)current_location; if(current_location_mcb-i

文档评论(0)

1亿VIP精品文档

相关文档