内蒙古机电职业技术学院

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

提速啦(24元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

Hosteons - 限时洛杉矶/达拉斯/纽约 免费升级至10G带宽 低至年$21

Hosteons,一家海外主机商成立于2018年,在之前还没有介绍和接触这个主机商,今天是有在LEB上看到有官方发送的活动主要是针对LEB的用户提供的洛杉矶、达拉斯和纽约三个机房的方案,最低年付21美元,其特点主要在于可以从1G带宽升级至10G,而且是免费的,是不是很吸引人?本来这次活动是仅仅在LEB留言提交账单ID才可以,这个感觉有点麻烦。不过看到老龚同学有拿到识别优惠码,于是就一并来分享给有需...

ZoeCloud:香港BGP云服务器,1GB内存/20GB SSD空间/2TB流量/500Mbps/KVM,32元/月

zoecloud怎么样?zoecloud是一家国人商家,5月成立,暂时主要提供香港BGP KVM VPS,线路为AS41378,并有首发永久8折优惠:HKBGP20OFF。目前,解锁香港区 Netflix、Youtube Premium ,但不保证一直解锁,谢绝以不是原生 IP 理由退款。不保证中国大陆连接速度,建议移动中转使用,配合广州移动食用效果更佳。点击进入:zoecloud官方网站地址zo...

内存管理为你推荐
网站虚拟主机创建网站要虚拟主机吗国内域名注册国内最靠谱的域名注册商是哪个?国际域名常用的国际顶级域名有哪些?企业虚拟主机购买虚拟主机要注意些什么?企业网站有什么好的虚拟主机推荐吗?linux主机linux主机有什么区别?求答案国外虚拟主机国外虚拟主机速度怎么样?免费域名空间求速度快的 免费空间 带域名的 谢谢大家网站空间购买不用备案的网站空间,哪里可以有这样的网站空间购买?免备案虚拟主机哪家免备案虚拟主机好,而且便宜点的?虚拟主机服务商请问哪个服务商的虚拟主机比较好呀
虚拟主机管理系统 域名商 华为云服务 dns是什么 fdcservers hawkhost优惠码 512au 免费个人博客 远程登陆工具 标准机柜尺寸 亚洲小于500m 183是联通还是移动 秒杀汇 可外链相册 服务器监测 申请网页 上海联通宽带测速 空间登录首页 宏讯 cxz 更多