内蒙古机电职业技术学院

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

香港云服务器 1核 256M 19.9元/月 Mineserver Ltd

Mineserver(ASN142586|UK CompanyNumber 1351696),已经成立一年半。主营香港日本机房的VPS、物理服务器业务。Telegram群组: @mineserver1 | Discord群组: https://discord.gg/MTB8ww9GEA7折循环优惠:JP30(JPCN2宣布产品可以使用)8折循环优惠:CMI20(仅1024M以上套餐可以使用)9折循...

SunthyCloud阿里云国际版分销商注册教程,即可PayPal信用卡分销商服务器

阿里云国际版注册认证教程-免绑卡-免实名买服务器安全、便宜、可靠、良心,支持人民币充值,提供代理折扣简介SunthyCloud成立于2015年,是阿里云国际版正规战略级渠道商,也是阿里云国际版最大的分销商,专业为全球企业客户提供阿里云国际版开户注册、认证、充值等服务,通过SunthyCloud开通阿里云国际版只需要一个邮箱,不需要PayPal信用卡就可以帮你开通、充值、新购、续费阿里云国际版,服务...

spinservers($89/月),圣何塞10Gbps带宽服务器,达拉斯10Gbps服务器

spinservers是Majestic Hosting Solutions LLC旗下站点,主要提供国外服务器租用和Hybrid Dedicated等产品的商家,数据中心包括美国达拉斯和圣何塞机房,机器一般10Gbps端口带宽,高配置硬件,支持使用PayPal、信用卡、支付宝或者微信等付款方式。目前,商家针对部分服务器提供优惠码,优惠后达拉斯机房服务器最低每月89美元起,圣何塞机房服务器最低每月...

内存管理为你推荐
域名注册网站域名注册网站有哪些国内域名注册。中国域名都在哪里可以注册?独立ip主机独立IP虚拟主机的主机弊端台湾vps台湾服务器 哪里稳定速度快?成都虚拟空间空间服务商那个好100m虚拟主机万网和新网虚拟主机有100M的吗深圳虚拟主机需要一个虚拟主机???很急!!虚拟主机测评虚拟主机哪个最好广西虚拟主机南宁有实力的网络公司推荐下?免费域名给我一个最有用的申请免费域名的地址
服务器配置技术网 加勒比群岛 空间出租 网站木马检测工具 100m独享 qq对话框 福建铁通 七夕快乐英语 国外网页代理 好看的空间 windowsserver2008r2 webmin hosts文件 let 内存 电脑主机 时间同步服务器地址 电脑主机嗡嗡响 个人域名如何备案 彩虹云点播官网 更多