全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C语言基础之malloc和free函数详解

    本文介绍malloc和free函数的内容。

  在C中,对内存的管理是相当重要。下面开始介绍这两个函数:

  一、malloc()和free()的基本概念以及基本用法:

1、函数原型及说明:

void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。

关于分配失败的原因,应该有多种,比如说空间不足就是一种。

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

2、函数的用法:

     其实这两个函数用起来倒不是很难,也就是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、申请了内存空间后,必须检查是否分配成功。

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会

出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。

D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。

现在进入第二部分:

   二、malloc()到底从哪里得来了内存空间:

1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。关于堆的知识呢可以查询数据结构方面的知识或查询以前的一篇帖子C/C++堆、栈及静态数据区详解。这里不过多介绍。

2、在使用malloc()分配内存空间后,一定要记得释放内存空间,否则就会出现内存泄漏。

3、free()到底释放了什么

free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。

   三、malloc()以及free()的机制:

事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。

大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。

malloc()申请的空间实际就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,经常用结构来记录信息!下面看看这个结构体的原型:

程序代码:

 struct mem_control_block { 
 int is_available; //一般来说应该是一个可用空间的首地址,但这里英文单词却显示出空间是否可用的一个标记
 int size;   //这是实际空间的大小 
 };

 

  所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。
  下面看看free()的源代码
   // code... 
 
  void free(void *ptr) 
 { 
   struct mem_control_block *free; 
   free = ptr - sizeof(struct mem_control_block); 
   free->is_available = 1; 
   return; 
 }

  至于malloc的源码,有兴趣的可以到网上找一下!

        感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C语言基础之malloc和free函数  # malloc和free函数  # C语言详细分析讲解内存管理malloc realloc free ca  # C语言初识动态内存管理malloc calloc realloc fr  # C语言中动态内存分配malloc、calloc和realloc函数解析  # c语言 malloc函数详解  # 详解C语言用malloc函数申请二维动态数组的实例  # c语言malloc函数的用法示例和意义  # 这块  # 是一个  # 这两个  # 的是  # 操作系统  # 就会  # 很难  # 两次  # 链表  # 将该  # 应该是  # 这是  # 我想  # 来了  # 也会  # 第一个  # 也就  # 然后就  # 遍历  # 中有 


相关文章: 如何在VPS电脑上快速搭建网站?  定制建站流程解析:需求评估与SEO优化功能开发指南  如何零成本快速生成个人自助网站?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  制作表格网站有哪些,线上表格怎么弄?  如何获取PHP WAP自助建站系统源码?  建站之星免费版是否永久可用?  如何在IIS服务器上快速部署高效网站?  香港服务器如何优化才能显著提升网站加载速度?  nginx修改上传文件大小限制的方法  css网站制作参考文献有哪些,易聊怎么注册?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何在宝塔面板中修改默认建站目录?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  建站上市公司网站建设方案与SEO优化服务定制指南  如何用虚拟主机快速搭建网站?详细步骤解析  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  如何在橙子建站中快速调整背景颜色?  高端云建站费用究竟需要多少预算?  简历在线制作网站免费版,如何创建个人简历?  代购小票制作网站有哪些,购物小票的简要说明?  ,制作一个手机app网站要多少钱?  如何在云虚拟主机上快速搭建个人网站?  建站之星如何实现五合一智能建站与营销推广?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  SQL查询语句优化的实用方法总结  如何快速搭建高效服务器建站系统?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  制作网站怎么制作,*游戏网站怎么搭建?  如何零基础开发自助建站系统?完整教程解析  如何在阿里云香港服务器快速搭建网站?  如何在宝塔面板创建新站点?  如何零基础在云服务器搭建WordPress站点?  图册素材网站设计制作软件,图册的导出方式有几种?  如何在西部数码注册域名并快速搭建网站?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何快速搭建高效简练网站?  如何通过虚拟主机空间快速建站?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  小型网站建站如何选择虚拟主机?  实例解析Array和String方法  文字头像制作网站推荐软件,醒图能自动配文字吗?  ,柠檬视频怎样兑换vip?  大型企业网站制作流程,做网站需要注册公司吗?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  威客平台建站流程解析:高效搭建教程与设计优化方案  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Android自定义listview布局实现上拉加载下拉刷新功能  网站微信制作软件,如何制作微信链接?  C++如何编写函数模板?(泛型编程入门) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。