版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作业一实验一:可变分区存储管理(一)
实验题目编写一个C程序,用char*malloc(unsignedsize函数向系统申请一次内存空间(如size=1000,单位为字节),模拟可变分区内存管理,实现对该内存区的分配和释放管理。(二)
实验目的1.加深对可变分区的存储管理的理解;2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;3.掌握用指针实现链表和在链表上的基本操作。图2-9释放区与前后空闲区相邻的情况(三)程序代码#include#include#include#definenew(type(type*malloc(sizeof(typetypedefstruct_map{unsignedintsize;char*address;struct_map*next;struct_map*prev;}map;typedefmap*pmap;typedefstruct_mem{unsignedinttotalSize;char*space;pmaphead;pmapcMap;}mem;typedefmem*pmem;pmemcreateMem(unsignedintto_size//创建内存区域{pmemnewMem=new(mem;pmapnewHead=new(map;newMem->totalSize=to_size;newHead->size=to_size;newHead->address=newMem->space;newHead->next=newHead;newHead->prev=newHead;newMem->head=newHead;newMem->cMap=newHead;returnnewMem;}voidfreeMem(pmemm{pmapmap,cMap;pmaphead=m->head;free(map->address;for(map=head;map->next!=head;{cMap=map;map=cMap->next;free(cMap;}free(m;}char*lmalloc(pmemcMem,unsignedintsize//分配函数{if(size>1000{printf("内存容量超出范围!\n";//当需要分配的内存空间已经大于实际空间时出错}else{pmapp=cMem->cMap;char*rAddr;if(size==0returnNULL;while(p->size{if(p->next==cMem->cMapreturnNULL;p=p->next;}rAddr=p->address;p->size-=size;p->address+=size;if(p->size==0{p->prev->next=p->next;p->next->prev=p->prev;cMem->cMap=p->next;if(cMem->head==pcMem->head=p->next;if(p->next!=cMem->headfree(p;}else{cMem->cMap=p;}returnrAddr;}}voidlfree(pmemm,unsignedintsize,char*addr//释放函数{pmapnextMap,prevMap,newMap;if(addrspace||addr>=m->space+m->totalSize{fprintf(stderr,"地址越界\n";//释放空间时,大小输入出错return;}nextMap=m->head;while(nextMap->address{nextMap=nextMap->next;if(nextMap==m->headbreak;}prevMap=nextMap->prev;if(nextMap!=m->head&&prevMap->address+prevMap->size==addr//第一种情况{prevMap->size+=size;if(addr+size==nextMap->address//第二种情况{prevMap->size+=nextMap->size;prevMap->next=nextMap->next;prevMap->next->prev=prevMap;if(nextMap==m->cMap{m->cMap=prevMap;}free(nextMap;nextMap=NULL;}}else{if(addr+size==nextMap->address//第三种情况{nextMap->address-=size;nextMap->size+=size;}else//第四种情况{newMap=new(map;newMap->address=addr;newMap->size=size;prevMap->next=newMap;newMap->prev=prevMap;newMap->next=nextMap;nextMap->prev=newMap;if(nextMap==m->headm->head=newMap;}}}voidprintMem(pmemm//打印函数{pmapmap=m->head;printf("\空闲内存空间:\n\-----------------------\n\大小起始地址\n";do{if(map==m->cMapprintf("->";elseprintf("";printf("%10u%10u\n",map->size,map->address;map=map->next;}while(map!=m->head;printf("-----------------------\n";}voidmain(//主函数{printf("--------------------------------------------------------\n";printf("请选择操作:分配内存(mor释放内存(for打印内存表(p\n";printf("--------------------------------------------------------\n";typedefenum{cmdMalloc,cmdFree,cmdPrint,cmdHelp,cmdQuit,cmdInvalid}cmdType;pmemm=createMem(1000;charcmd[20];char*addr;unsignedintsize;cmdTypetype;while(1{scanf("%s",cmd;if(cmd[1]=='\0'{switch(cmd[0]{case'm':case'M':type=cmdMalloc;break;case'f':case'F':type=cmdFree;break;case'p':case'P':type=cmdPrint;break;}}else{if(!strcmp(cmd,"malloc"type=cmdMalloc;elseif(!strcmp(cmd,"free"type=cmdFree;elseif(!strcmp(cmd,"print"type=cmdPrint;}switch(type{casecmdMalloc:scan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农产品冷链物流发展规划
- 论文 论工程质量失控原因及质量控制管理
- 硫磷混酸协同体系高效处理复杂白钨矿新技术
- 记账实操-再生资源企业的账务处理分录
- 《我的伯父鲁迅先生》人格魅力教案
- 《安全伴我行》安全教育教案
- 专升本(英语)模拟试卷42(共883题)
- 江苏省苏州市2024-2025学年高三上学期开学调研测试语文试题及参考答案
- 沪科粤教版初中九年级下册学案(含答案) 全册
- 苏教版小学六年级数学上册单元试题 全册
- 消防安全培训 烟草
- JJG 1132-2017热式气体质量流量计
- 注塑件工艺流程
- 贵州省遵义市2023-2024学年八年级上学期期末语文试题
- 社会主义核心价值观自由篇
- 临床试验研究者职责
- 高寒地区户外电源解决方案
- 网络传播概论(第5版) 课件 第三章 网络传播形式之SNS社交网络
- 儿童康复治疗
- 渔业历史文化与传统民俗
- 中医饮食营养学(中医饮食营养学讲稿)
评论
0/150
提交评论