c中free的用法.docx
《c中free的用法.docx》由会员分享,可在线阅读,更多相关《c中free的用法.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、c中free的用法c中free的用法下面我就跟你们具体介绍下c中free的用法的用法,希望对你们有用。c中free的用法的用法如下:在C语言的学习中,对内存管理这部分的知识把握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用就是malloc然后free就一切OK了。当然如今对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个浅谈的字眼,也就是这个意思了!希望对大家有一点帮助!假如不扯得太远的话比方讲操作系统中虚拟内存和物理内存怎样运做怎样管理之类的知识等,我感觉这
2、篇文章应该是比拟全面地谈了一下malloc()和free().这篇文章由浅入深不见得有多深分三个部分介绍主要内容。废话了那么多,下面立即进入主题=)一、malloc()和free()的基本概念以及基本用法:1、函数原型及讲明:void*malloc(longNumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。假如分配失败,则返回一个空指针NULL。关于分配失败的原因,应该有多种,比方讲空间缺乏就是一种。voidfree(void*FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。2、函数的
3、用法:其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:/Code.char*Ptr=NULL;Ptr=(char*)malloc(100*sizeof(char);if(NULL=Ptr)exit(1);gets(Ptr);/code.free(Ptr);Ptr=NULL;/code.就是这样!当然,详细情况要详细分析以及详细解决。比方讲,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。3、关于函数使用需要注意的一些地方:A、申请了内存空间后,必须检查能
4、否分配成功。B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。C、这两个函数应该是配对。假如申请后不释放就是内存泄露;假如无故释放那就是什么也没有做。释放只能一次,假如释放两次及两次以上会出现错误释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题。D、固然malloc()函数的类型是(void*),任何类型的指针都能够转换成(void*),但是最好还是在前面进行强迫类型转换,由于这样能够躲过一些编译器的检查。好了!最基础的东西大概这么讲!如今进入第二部分:二、malloc()到底从哪里得来了内存空间:
5、1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是讲函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!讲到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?讲到堆,又忍不住讲到了栈!什么是栈?下面就另外开个小部分专门而又简单地讲一下这个题外话:2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统
6、对进程初始化的时候分配,运行经过中可以以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开场的时候初始化,每个线程的栈相互独立。每个函数都有本人的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。以上的概念描绘是标准的描绘,不过有个别语句被我删除,不知道由于这样而变得不标准了_.通过上面对概念的描绘,能够知道:栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据构造中的栈。堆一般由程序员分配
7、释放,若不释放,程序结束时可能由OS回收。注意这里讲是可能,并非一定。所以我想再强调一次,记得要释放!注意它与数据构造中的堆是两回事,分配方式倒是类似于链表。这点我上面略微提过所以,举个例子,假如你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比方讲下面这个函数:/code.voidFunction(void)char*p=(char*)malloc(100*sizeof(char);就这个例子,千万不要以为函数返回,函数所在的栈被销毁指针也跟着销
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- free 用法
限制150内