内蒙古机电职业技术学院

内存管理  时间:2021-01-16  阅读:()

教案首页课程:c语言程序设计授课顺次:16学时:2班级:计信、自动化日期:第节课题6.
2内存管理库函数目的要求让学生了解内存管理库函数重点难点1、C语言的库函数的管理教学过程后附教学手段教学方法:讲授、演示教学媒体:多媒体教学网课后分析以讲述理论知识为主,多举实例.
6.
2内存管理库函数6.
2.
1PC机CPU及存储器结构(略)6.
2.
2编译模式(略)6.
2.
3内存管理库函数(1)分配存储空间函数malloc()malloc()函数的原型为:void*malloc(unsignedsize);函数的作用是在内存自由空间开辟一块大小为size字节的空间,并将此存储空间的起始地址作为函数值带回.
例如,malloc(10)的结果是分配了一个长度为10字节的内存空间,若系统设定的此内存空间的起始地址为1800,则malloc(10)的函数返回值就为1800.
(2)分配存储空间函数calloc()calloc()函数的原型为:void*calloc(unsignedn,unsignedsize);所分配的存储空间大小能容纳多个元素,且每个元素长度一致.
(3)重新分配空间函数realloc()函数用于使已分配的空间改变大小,即重新分配,其原型void*realloc(void*ptr,unsignednewsize);(4)释放空间函数free()该函数的原型为:voidfree(void*ptr);该函数的功能为:将指针ptr指向的存储空间释放,交还给系统,系统可以另行分配作它用.
必须指出,ptr值不能是随意的地址,而是只能是程序在运行时通过动态申请分配到的存储空间的首地址.

下面的做法是正确的:pt=(long*)malloc(10);………free();例6.
4编程完成申请一个长512字节的动态数组,从标准输入设备上读入一个字符串放人该数组中,再将它从标准输出设备上输出.

#include"stdio.
h"#include"stdlib.
h"#include"alloc.
h"main(){char*malloc(),*buf;buf=malloc(512);/*分配512字节的内存空间*/fputs("enteralineofdata:",stdout);fgets(buf,512,stdin);/*从标准输入设备输入字符串*/fputs(buf,stdout);/*从标准输出设备输出字符串*/free(buf);/*释放申请的内存空间*/}6.
2.
4内存管理库函数应用示例——链表所谓链表是指若干个数据项(每个数据项称为一个"结点")按一定的原则连接起来.
每个数据项都包含有若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接成一个链表.
下图表示了一个简单的链表.

(1)建立链表示例用链表存放学生数据,表中每一个数据项存放一个学生的数据.
链表建立程序如下:#delfinNULL0#defineLENsizeof(structstudent)structstudent{longnum;floatscore;structstudent*next;};intn;structstudent*creat()/*此函数带回一个指向链表头的指针*/{structstudent*head,*p1,*p2;n=0;p1=p2=(structstudent)malloc(LEN);/*开辟一个新单元*/scanf("%ld,%f",&p1->num,&p1->score);head=NULL;while(p1->num!
=0){++n;if(n==1)head=p1;elsep2->next=p1;p2=p1;p1=(structstudent*)malloc(LEN);scanf("%ld,%f",&p1->num,&p1->score);}p2->next=NULL;return(head);}关于函数的说明:第一行为#define命令行,令NULL代表0,用它表示"空地址".
第二行令LEN代表structstudent结构体类型数据的长度,sizeof是"求字节数运算符".
creat函数是指针类型,即此函数带回一个指针值,它指向一个structstudent类型数据.
实际上creat函数带回一个链表起始地址.
在一般系统中,malloc带回的是指向字符型数据的指针.
而p1、p2是指向structstudent类型数据的指针变量,两者所指的是不同类型的数据.
因此必须用强制类型转换的方法使之类型一致,在malloc(LEN)之前加了"(structstudent*)",它的作用是使malloc返回的指针转换为指向structstudent类型数据的指针.
注意"*"号不可省略,否则变成转换成structstudent类型了,而不是指针类型了.
函数返回的是head的值,也就是链表的头地址.
n代表结点个数.
(2)结点删除要删除的是第一个结点(p1的值等于head值),则应将p1->next赋给head.
这时head指向原来第二个结点.
第一个结点虽然还存在,但它已与链表脱离.
现在链表的第一个结点是原来第二个结点,原来第一个结点"丢失".

(2)如果要删除的不是第一个结点,则将p1->next赋给p2->next.
p2->next原来指向p1指向的结点,现在p2->next改为指向p1->next所指向的结点.
p1所指向的结点不再是链表的一部分.

算法中还需要考虑链表是空表(无结点)和链表中找不到要删除的结点的情况.

删除一个结点的函数delete如下:structstudent*delete(structstudent*head,longnum){structstudent*p1,*p2;if(head==NULL){printf("\nlistnull!
\n");gotoend;}p1=head;while(num!
=p1->num&&p1->next!
=NULL)/*p1指向的不是所要找的结点,并且后面还有结点*/{p2=p1;p1=p1->next;}/*后移一个结点*/if(num==p1->num){if(p1==head)head=p1->next;/*若p1指向的是头结点,把第二个结点的地址赋给head,即删除头结点*/elsep2->next=p1->next;/*否则将下一个结点的地址赋给前一结点的地址.
即删除非头结点*/printf("delete:%ld\n",num);n--;/*链表结点数减1*/}elseprintf("%ldnotbeenfound!
\n",num);/*找不到该结点*/end:return(head);}delete函数的类型是指向structstudent类型数据的指针,它的返回值是链表的头指针.
函数参数为head和要删除的学号num.
当删除第一个结点时,head的值可能在函数执行过程中被改变.

(3)插入结点的函数insert如下:#defineLENsizeof(structstudent)structstudent{longnum;floatscore;structstudent*next;};structstudent*insert(structstudent*head,structstudent*stud){structstudent*p0,*p1,*p2;p1=head;/*p1指向第一个结点*/p0=stud;/*p0指向要插入的结点*/if(head==NULL)/*原来是空表*/{head=p0;p0->next=NULL;}/*使p0指向的结点作为链表第一个结点*/Else{while((p0->num>p1->num)&&(p1->next!
=NULL)){p2=p1;p1=p1->next;}/*p2指向刚才p1指向的结点,p1后移一个结点*/if(p0->numnum){if(head==p1)head=p0;/*插到原来第一个结点之前*/else{p2->next=p0;/*插到p2指向的结点之后*/p0->next=p1;}else{p1->next=p0;p0->next=NULL;}}/*插到最后结点之后*/++n;/*结点数加1*/return(head);}insert函数参数是两个结构体类型指针变量head和stud.
从实参传来待插入结点的地址传给stud,语句p0=stud的作用是使p0指向待插入结点.
函数类型是指针类型,函数返回值是链表起始地址head.

(4)链表的输出操作要依次输出链表中各结点的数据比较容易处理.
首先要知道链表头结点的地址,也就是要知道head的值,然后设一个指针变量p,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,再输出.
直到链表的尾结点.

输出链表的函数print如下:voidprint(structstudent*head){structstudent*p;prinft("\nNow,These%dnodesare:\n",n);p=head;if(head!
=NULL)do{printf("%d%5.
lf\n",p->num,p->score);p=p->next;}while(p!
=NULL);}p首先指向第一个结点,在输出完第一个结点之后,将p原来所指向的结点中的next值赋给p(即p=p->next),而p->next的值就是下一个结点的起始地址.
将它赋给p就是p指向下一个结点.

head的值由实参传过来也就是将已有的链表的头指针传给被调用的函数,在print函数中从head所指的第一个结点出发,顺序输出各个结点.

(5)链表的查找操作链表的查找是指在已知链表中查找值为某指定值的结点.
链表的查找过程是从链表的头指针所指的第一个结点出发,顺序查找.
或发现有指定值的结点,以指向该结点的指针值为查找结果;或查找至链表结尾,未发现有指定值的结点,查找结果为NULL,表示链表中没有指定值的结点.
为简单起见,以指定的学号作为查找结点的标志.

TMTHosting:夏季优惠,美国西雅图VPS月付7折,年付65折,美国服务器95折AS4837线路

tmthosting怎么样?tmthosting家本站也分享过多次,之前也是不温不火的商家,加上商家的价格略贵,之到斯巴达商家出现,这个商家才被中国用户熟知,原因就是斯巴达家的机器是三网回程AS4837线路,而且也没有多余的加价,斯巴达家断货后,有朋友发现TMTHosting竟然也在同一机房,所以大家就都入手了TMTHosting家的机器。目前,TMTHosting商家放出了夏季优惠,针对VPS推...

cloudcone:特价便宜VPS补货通知贴,SAS或SSD低价有磁盘阵列,SAS或SSD raid10 硬盘

cloudcone经常性有特价促销VPS放出来,每次的数量都是相当有限的,为了方便、及时帮助大家,主机测评这里就做这个cloudcone特价VPS补货专题吧,以后每次放货我会在这里更新一下日期,方便大家秒杀!官方网站:https://cloudcone.com/预交费模式,需要充值之后方可使用,系统自动扣费!信用卡、PayPal、支付宝,均可付款购买!为什么说cloudcone值得买?cloudc...

ThomasHost(月付5美元)美国/法国/英国/加拿大KVM,支持Windows

ThomasHost域名注册自2012年,部落最早分享始于2016年,还算成立了有几年了,商家提供基于KVM架构的VPS,数据中心包括美国、法国、英国、加拿大和爱尔兰等6个地区机房,VPS主机套餐最低2GB内存起步,支持Windows或者Linux操作系统,1Gbps端口不限制流量。最近商家提供了一个5折优惠码,优惠后最低套餐月付5美元起。下面列出部分套餐配置信息。CPU:1core内存:2GB硬...

内存管理为你推荐
虚拟主机什么是虚拟主机网站虚拟主机虚拟主机是什么?与网站建设是什么关系?美国虚拟空间美国虚拟主机无限空间是什么意思?免费虚拟空间谁可以推荐一个比较很不错的免费虚拟空间免费国内空间跪求国内最好的免费空间!海外域名求国外域名商列表云服务器租用租用云服务器,要注意什么?100m网站空间做网站100M的空间够用吗?虚拟主机评测麻烦看一下这些虚拟主机商那个好?广西虚拟主机江西服务器托管,但要接入专线,问了很多代理都说不可以,如何解决?
西安域名注册 汉邦高科域名注册 合租服务器 什么是域名解析 西安服务器 新加坡服务器 diahosting 电影服务器 z.com 优惠码 美国便宜货网站 天猫双十一秒杀 灵动鬼影 宁波服务器 linux服务器维护 512mb 国外的代理服务器 畅行云 lamp什么意思 阿里云邮箱登陆地址 更多