在C语言中,malloc是动态内存分配函数。
函数原型:void*malloc(unsignedintnum_bytes)。
参数:num_bytes是一个无符号整数,用于表示分配的字节数。
注意:当内存不再使用时,必须使用free()函数释放内存块。函数返回的指针必须正确对齐,以便它可以与任何数据对象一起使用。关于这个函数的原型,malloc之前返回的是一个char指针,新的ANSIC标准规定这个函数返回的是一个void指针,所以必要的时候需要进行类型转换。
实现malloc的方法:
首先我们需要定义所使用的数据结构。一个简单可行的解决方案就是以块、指针等形式来组织堆内存空间。
数据区是实际分配的内存区域,数据区第一个字节的地址是malloc返回的地址。
在C语言中,malloc是一个动态内存分配函数。
函数原型:void*malloc(unsignedintnum_bytes);
参数:num_bytes是一个无符号整数,用于表示分配的字节数。
返回值:如果分配成功,则将指针返回到所分配的内存(该存储区域的初始值不确定),否则返回NULL指针。void*表示未定义类型的指针。void*可以指任何类型的数据,更具体地说,它意味着在内存中申请空间时,不知道用户将使用什么类型的数据来存储它(例如char、int、...)
功能:分配长度为num_bytes的内存块
说明:当内存不被使用时,应使用free()函数释放内存块。函数返回的指针必须正确对齐,以便它可以与任何数据对象一起使用。从这个函数的原型来看,malloc之前返回的是一个char指针。新的ANSIC标准规定该函数返回空指针,因此必要时需要进行类型转换。
扩展信息:
Malloc实现方法:
(1)数据结构
首先我们定义使用的数据结构。一个简单且可能的解决方案是将堆内存空间组织成块。每个块由标识区和数据区组成,数据区记录了数据块的元信息(数据区的大小、空闲标志位)。、指标等)。
数据区是实际分配的内存区域,数据区第一个字节的地址是malloc返回的地址。
(2)找到正确的区块
现在想想如何在区块链中找到正确的区块。一般有两种搜索算法:
Firstfit:从第一个数据区域大于所需大小的块开始,称为自定义块
Bestfit:从第一个块开始首先,遍历所有块,将数据区大小大于大小且差值最小的块作为分配块
两种方法各有优点,bestfit内存占用较高(higherload),并且firstfit系统也具有较高的运行效率。这里我们使用firstfit算法。