函数原型:void *malloc(unsigned int num_bytes)
参数:num_bytes 是无符号整型,用于表示分配的字节数。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
功能:分配长度为num_bytes字节的内存块
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
扩展资料:
实现malloc的方法:
(1)数据结构
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
(2)寻找合适的block
现在考虑如何在block链中查找合适的block。一般来说有两种查找算法:
First fit:从头开始,使用第一个数据区大小大于要求size的块所谓此次分配的块
Best fit:从头开始,遍历所有块,使用数据区大小大于size且差值最小的块作为此次分配的块
两种方式各有千秋,best fit有较高的内存使用率(payload较高),而first fit具有较高的运行效率。这里我们采用first fit算法。
在C语言中使用malloc函数进行动态内存分配。malloc的全称是memoryallocation,中文叫动态内存分配。
原型:extern
void
*malloc(unsigned
int
num_bytes)
功能:分配长度为num_bytes字节的内存块。注意是分配的内存是按字节来计算的。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。示例如下,注意看注释:
#include<stdio.h>
//使用malloc需要加stdlib.h的头文件
#include <stdlib.h>
#include <string.h>
int main()
{
//分配内存10个int元素的数组,注意按字节分配,所以要乘以int类型所占的字节
int *p = (int *)malloc(sizeof(int) * 10)
if (p==0) {
printf("不能分配内存\n")
return 0
}
//初始化内存
memset(p, 0x00, sizeof(int) * 10)
int inx
//使用
for (inx=0inx!=10++inx) p[inx] = inx
for (inx=0inx!=10++inx) printf("%d\t", p[inx])
printf("\n")
//释放
free(p)
return
}
能强制转换的。你右边强制转换的是结构体的一个指针,左边呢?没见到过。你左边要么是*phonebook 要么phonebook[100]. *phonebook[100]是指向指针的指针。malloc函数返回的是一个地址,但是你不知道这个地址到底是要给一个什么变量的。所以要明确的强制转换。