本文介绍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的源码,有兴趣的可以到网上找一下!

malloc和free函数详解相关推荐

  1. c语言中用来指示文件缓冲区中具体读写位置,C语言文件读写操作中缓冲区问题和setbuf函数详解...

    清除和设置文件缓冲区 (1).清除文件缓冲区函数: int fflush(FILE *stream); int flushall(); fflush()函数将清除由stream指向的文件缓冲区里的内容 ...

  2. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  3. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  4. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  5. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  6. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  7. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  8. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  9. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

最新文章

  1. SAP系统和微信集成的系列教程之七:使用Redis存储微信用户和公众号的对话记录
  2. 算法设计与分析——回溯法——批处理作业调度
  3. 鸿蒙 电视 安卓,华为鸿蒙2.0来了!打通手机、电视、PC全平台,Mate 40 整装齐发...
  4. 计算机转正述职报告ppt,转正述职报告ppt
  5. Typecho 动漫单栏主题First
  6. ArcPy处理土地利用类型数据
  7. WPF RichTextBox的Document属性的序列化与反序列化
  8. 搜狗发布全球首位 3D AI 主播,背后分身技术有玄机
  9. oppo怎么广告接入_OPPO游戏创游无境 构建强大的游戏生态
  10. 用crt连接远程linux,在windows下secureCRT远程安全连接linux
  11. 银行计算机储蓄系统程序流程图,银行储蓄系统流程图
  12. TCP/UDP测试工具下载及使用教程
  13. 轻松入门微信小程序云开发(详细)
  14. 关于DES加密内部收费版
  15. jsPdf前端页面直接生成Pdf盖章下载
  16. 视频编码c语言,MPEG4codec(c) MPEG4视频格式的编解码源码 C语言实现 - 下载 - 搜珍网...
  17. python输出奇数个数_Python实践|输出0-7组成八位奇数总数
  18. Cannot use import statement outside a module
  19. 数据库异常:无效的授权说明 [ 0x80040e4d ]
  20. 腾讯小程序服务器忙,使用腾讯云助手小程序管理腾讯云服务器

热门文章

  1. Linux jobs等前后台运行命令详解
  2. 解决wamp、vertrigo等集成环境安装后apache不能启动的问题
  3. channel rabbitmq 配置_「喵咪MQ(2)」RabbitMQ单机模式使用
  4. mybatis 配置_MyBatis教程3:优化MyBatis配置文件中的配置
  5. 5G 标准 — 3GPP
  6. 架构师之路 — 数据库设计 — 关系型数据库理论
  7. Go 语言编程 — Cobra 指令行工具
  8. 互联网协议 — ARP 地址解析协议
  9. GD32定时器输入捕获例程
  10. ubuntu修改根用户密码