c语言开发入门及项目实战课件第14章存储管理_第1页
c语言开发入门及项目实战课件第14章存储管理_第2页
c语言开发入门及项目实战课件第14章存储管理_第3页
c语言开发入门及项目实战课件第14章存储管理_第4页
c语言开发入门及项目实战课件第14章存储管理_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

存储管理

教学目的内容1

教学要求2

重点难点3

教学内容4教学目的通过本章的学习,了解内存的组织结构,了解堆和栈的不同,掌握使用动态管理内存的函数,了解内存在什么情况会丢失。教学要求了解内存组织方式;区分堆和栈的不同;掌握动态管理所用函数;了解内存丢失情况。重点难点重点:内存的组织方式

动态管理函数。难点:内存丢失动态管理函数教学内容内存丢失。内存组织形式;动态管理

;内存组织方式1.内存的组织方式开发人员将程序编写完成之后,程序要先装载到计算机的内核或者半导体内存中,然后再运行程序。程序被组织成4个逻辑段:(1)可执行代码(2)静态数据可执行代码和静态数据,存储在固定的内存位置。(3)动态数据(堆)程序请求动态分配的内存来自内存池,也就是上面所列举中的堆。(4)栈局部数据对象、函数的参数以及调用函数和被调用函数的联系放在称为栈的内存池中。但是以上的4类根据操作平台和编译器的不同,堆和栈可以是被所有同时运行的程序共享的操作系统资源,也可以是使用程序独占的局部资源。内存组织方式

2.堆与栈在内存组织方式可以看到堆是用来存放动态分配内存空间的,而栈是用来存放局部数据对象、函数的参数、调用函数和被调用函数的联系。接下来对两者进行详细的说明。(1)堆在内存的全局存储空间当中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。(2)栈程序不会像处理堆那样的在栈中显示地分配内存。当程序调用函数和声明局部变量时,系统将自动分配内存。栈是一个后进先出的压入弹出式的数据结构。在程序运行时,是每次向栈中压入一个对象,然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最近进栈的对象将被弹出,然后栈指针向上移动一个位置。如果栈指针位于栈顶,表示栈是空的;如果栈指针指向最下面的数据项的后一个位置,表示栈为满的。动态管理

1.malloc函数其函数的原型如下:void*malloc(unsignedintsize);在stdlib.h头文件中包含该函数,作用是在内存中动态的分配一块size大小的内存空间。malloc函数会返回一个指针,该指针指向分配的内存空间,如果出现错误返回NULL。例如使用该函数分配一个整型内存空间:int*pInt;pInt=(int*)malloc(sizeof(int));首先定义指针pInt用来保存分配内存的地址。在使用malloc函数分配内存空间时,需要指定具体的内存空间的大小(size),这时调用函数sizeof就可以得到指定类型的大小。malloc成功分配内存空间后会返回一个指针,因为分配的是一个int型空间,所以在返回指针时也应该是相对应的int型指针,这样的话就要进行强制类型转化。最后将函数返回的指针赋值给指针pInt就可以保存动态分配的整型空间地址了。动态管理2.calloc函数其函数的原型如下:void*calloc(unsignedn,unsignedsize);使用该函数也要包含头文件stdlib.h,该函数的功能是在内存中动态分配n个长度为size的连续内存空间数组。calloc函数会返回一个指针,该指针指向动态分配的连续内存空间地址。当分配空间错误时,返回NULL。例如使用该函数分配一个整型数组内存空间:int*pArray; /*定义指针*/pArray=(int*)calloc(3,sizeof(int)); /*分配内存数组*/在上面的代码中pArray为一个整型指针,使用calloc分配内存数组,在参数中第一个参数表示分配数组中元素的个数,而第二个参数表示元素的类型。最后将返回的指针赋给pArray指针变量,pArray指向的就是该数组的首地址。动态管理

3.realloc函数其函数的原型如下:void*realloc(void*ptr,size_tsize);首先使用该函数要包含头文件stdlib.h,其功能是改变ptr指针指向的空间大小为size大小。设定的size大小可以是任意的,也就是说可以比原来的数值大,也可以比原来的数值小。返回值是一个指向新地址的指针,如果出现错误则返回NULL。例如改变一个分配的实型的空间大小成为整型大小:fDouble=(double*)malloc(sizeof(double));iInt=realloc(fDouble,sizeof(int));其中fDouble是指向分配的实型空间,之后使用的是realloc函数改变fDouble指向的空间的大小,其大小设置为整型,然后将改变后的内存空间的地址返回赋值给iInt整型指针。动态管理4.free函数其函数的原型如下:voidfree(void*ptr);该函数的功能使用由指针ptr指向的内存区,使部分内存区能被其他变量使用。ptr是最近一次调用calloc或malloc函数时返回的值。free函数无返回值。例如释放一个分配整型变量的内存空间:free(pInt);代码中pInt为一个指向一个整型大小的内存空间,使用free将其进行释放。

内存丢失

在使用malloc等函数分配内存后,要对其使用free函数进行释放。因为内存不进行释放会造成内存遗漏可能会系统崩溃。因为free函数的用处在于实时的执行回收内存的操作,如果程序很简单,那么不用写free函数去释放内存也可以,当程序结束之前也不会使用很多的内存,不会降低系统的性能。当程序结束后,操作系统会将完成释放的功能。但是如果在开发大型程序时,不写free函数去释放内存是很严重的。因为很可能在程序中要重复一万次分配10M的内存,那么每次进行分配内存后都使用free函数去释放用完的内存空间,那么这个程序只需要使用10M内存就可以运行。但是如果不使用free函数,那么程序就要使用100G的内存!因为这其中包括绝大部分的虚拟内存,而由于虚拟内存的操作是需要读写磁盘,因此,这样会极大的影响到系统的性能,系统因此可能崩溃。所以在程序中编写malloc分配内存时都对应的写出一个free函数进行释放是一个良好的编程习惯,这不但体现在处理大型程序时的必要性,并能在一定程度上体现了程序优美的风格和健壮性。内存丢失但是有些时候,常常会有将内存丢失的情况,例如:pOld=(int*)malloc(sizeof(int));pNew=(int*)malloc(sizeof(int));这两段代码分别表示了创建了一块内存,并且将内存的地址传给了指针pOld和pNew。此时指针pOld和pNew分别指向两块内存。如果进行这样的操作:pOld=pNew;进行这样的操作后,那

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论