内蒙古机电职业技术学院

内存管理  时间: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,表示链表中没有指定值的结点.
为简单起见,以指定的学号作为查找结点的标志.

NameCheap黑色星期五和网络礼拜一

如果我们较早关注NameCheap商家的朋友应该记得前几年商家黑色星期五和网络星期一的时候大促采用的闪购活动,每一个小时轮番变化一次促销活动而且限量的。那时候会导致拥挤官网打不开迟缓的问题。从去年开始,包括今年,NameCheap商家比较直接的告诉你黑色星期五和网络星期一为期6天的活动。没有给你限量的活动,只有限时六天,这个是到11月29日。如果我们有需要新注册、转入域名的可以参加,优惠力度还是比...

香港 E5-2650 16G 10M 900元首月 美国 E5-2660 V2 16G 100M 688元/月 华纳云

华纳云双11钜惠出海:CN2海外物理服务器终身价688元/月,香港/美国机房,免费送20G DDos防御,50M CN2或100M国际带宽可选,(文内附带测评)华纳云作为一家专业的全球数据中心基础服务提供商,总部在香港,拥有香港政府颁发的商业登记证明,APNIC 和 ARIN 会员单位。主营香港服务器、美国服务器、香港/美国OpenStack云服务器、香港高防物理服务器、美国高防服务器、香港高防I...

云基Yunbase无视CC攻击(最高500G DDoS防御),美国洛杉矶CN2-GIA高防独立服务器,

云基yunbase怎么样?云基成立于2020年,目前主要提供高防海内外独立服务器,欢迎各类追求稳定和高防优质线路的用户。业务可选:洛杉矶CN2-GIA+高防(默认500G高防)、洛杉矶CN2-GIA(默认带50Gbps防御)、香港CN2-GIA高防(双向CN2GIA专线,突发带宽支持,15G-20G DDoS防御,无视CC)。目前,美国洛杉矶CN2-GIA高防独立服务器,8核16G,最高500G ...

内存管理为你推荐
网站服务器租用个人网站服务器租用一年多少钱域名主机域名,主机空间和网站文件三者之间的区别是什么域名购买为什么要购买域名,域名是干嘛用的?台湾vps台湾服务器 哪里稳定速度快?山东虚拟主机400电话哪家代理商办理得比较好云南虚拟主机云南服务器托管四川虚拟主机哪些网站适合租用独立服务器?域名停靠怎么域名停靠?新网域名新网域名怎么样域名估价域名评估,看看域名的价值多少钱
子域名查询 太原域名注册 中文域名交易中心 cybermonday Hello图床 ibox官网 193邮箱 如何用qq邮箱发邮件 电信托管 中国电信宽带测速器 华为云盘 永久免费空间 杭州电信宽带优惠 工信部icp备案查询 购买空间 稳定空间 域名和主机 卡巴斯基试用版下载 美国asp空间 美国主机 更多