内蒙古机电职业技术学院

内存管理  时间: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.香港机房选择香港机房相当于选择...

Hostodo(年付12美元),美西斯波坎机房Linux VPS主机66折

Hostodo 商家是比较小众的国外VPS主机商,这不看到商家有推送促销优惠在美国西岸的斯波坎机房还有少部分库存准备通过低价格促销,年付低至12美元Linux VPS主机,且如果是1GB内存方案的可以享受六六折优惠,均是采用KVM架构,且可以支付宝付款。第一、商家优惠码优惠码:spokanessd 1GB+内存方案才可以用到优惠码,其他都是固定的优惠低至年12美元。第二、商家促销这里,我们可以看到...

美国多IP站群VPS商家选择考虑因素和可选商家推荐

如今我们很多朋友做网站都比较多的采用站群模式,但是用站群模式我们很多人都知道要拆分到不同IP段。比如我们会选择不同的服务商,不同的机房,至少和我们每个服务器的IP地址差异化。于是,我们很多朋友会选择美国多IP站群VPS商家的产品。美国站群VPS主机商和我们普通的云服务器、VPS还是有区别的,比如站群服务器的IP分布情况,配置技术难度,以及我们成本是比普通的高,商家选择要靠谱的。我们在选择美国多IP...

内存管理为你推荐
linux虚拟主机如何安装LINUX虚拟机vps虚拟主机请通俗解析一下虚拟主机,VPS和云主机?它们各有什么用途?网络服务器租用租网络服务器在哪些平台比较合适?中文域名注册查询哪里有可以查询中文域名是否被注册的地方?虚拟主机推荐便宜的虚拟主机,推荐几个免费国外空间那个国外空间好啊啊 价格便宜 急需域名服务域名服务器是什么?有什么作用域名服务域名服务有何作用?如何设置?便宜的虚拟主机低价虚拟主机那种类型的好呢?国外主机空间可以购买国外主机(空间一样吗?)来做私服吗?
海外域名 windows虚拟主机 域名大全 美国服务器租用 万网域名空间 万网域名解析 80vps 狗爹 美国主机网 lighttpd 云图标 建站代码 嘟牛 三拼域名 免费mysql 数字域名 web服务器架设 腾讯云分析 hostloc 卡巴斯基试用版 更多