Malloc函数是什么?
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。malloc分配的内存大小至少为size参数所指定的字节数
malloc的返回值是一个指针,指向一段可用内存的起始地址
Malloc和free是C标准库中提供的普通函数,malloc和free是配对使用的一对函数。malloc负责向堆区申请一块内存,free负责释放
为什么要用malloc函数?
我们首先引入内存泄露的概念:
什么是内存泄漏(memory leak)?
内存泄露指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
我们来举一个实际的例子,假如我们手头有一款单片机,我们要用它的串口功能,于是我们在栈空间创建了一个int类型的数组a[ ]来存放串口数据,传输完以后就干别的,不用这个数组了,但是这个闲置的数组就占用了一块空间,如果数组很大呢?如果有很多个这样的数组呢?这样占用的空间无疑是可怕的,特别是对于存储空间较小的单片机来说。这就是俗话说的“占着茅坑不拉屎”。
于是我们便需要malloc函数和free函数了,还是单片机,还是用串口,此时我们不再直接创建数组了,而是用malloc()申请一块内存,然后在这块内存中创建数组,使用完以后我们就用free()直接释放了它,这样我们就可以更大程序的利用单片机的存储空间了。
Malloc函数的使用
① char*a=NULL;//声明一个指向a的char*类型的指针
② a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a
③ free(a);//释放掉使用的内存地址
malloc函数和free函数的执行方式
malloc
调用malloc函数时,它沿连接表从前向后,寻找一个没有被占用的,而且大到足以满足用户请求所需要的内存块。在寻找过程中,分三种情况。
第一种情况,倘若可用而且大小刚好合适,那么直接将此块返回就完成了分配。
第二种情况,倘若可用而且超过了所需要的内存块并且还能容纳一个新块的控制头部,这个时候就将此块一分为二。将分配给用户的那块内存的相应标志位置0(不再可用),然后将此块的有效数据区首地址作为函数值返回。而新块的控制头部要进行赋值(只有含有头部的块才能称的上一个块),没有控制头部的块不能进行管理。
第三种情况,倘若可用内存块的空间小于需要的空间,或者虽然超过了但是不能腾出一个控制头部,最终的处理都是跳过改块,移动到链表的下一块进行新一轮的比较。
free
free函数用于内存块的回收,当不用的内存块调用此函数释放空间的时候,将相应标志位置1(可以重新分配)。接下来要做的就是整合内存碎片。由于可能多次malloc函数,产生了很多的内存碎片,在释放一个块的时候,不仅要标记此块为“可用”。另外,还需要试着将此块前后的块进行合并,这样才能为将来申请更大的空间做好准备。 作者:白常香 https://www.bilibili.com/read/cv6332182/ 出处:bilibili
|