用于分配空间的函数malloc、calloc、realloc

来源:互联网 发布:备孕前准备 知乎 编辑:程序博客网 时间:2024/06/05 10:27

malloc、calloc函数的实现实质原理是将可以用的内存块连接成一个链表。当用户调用malloc函数时,会沿着链表找到一块满足用户要求大小的内存块。然后有一个链表一分为二的过程,用户需要的分配给用户,不需要的返回链表上。当用户使用完空间后,用free()释放,被释放的空间会重新返还到链表上。但多次操作后,空闲内存块就会很零碎,如果这个时候,用户申请一块内存块,malloc函数就会申请延时,然后遍历所有空闲内存块,将小内存块连接大内存块,再分配给用户。


malloc、realloc、calloc的作用、用法和区别(举例都用分配一块20个字节,存放字符型常量的例子):

malloc函数是在内存的动态存储区域(堆空间)中分配一块长度为size的字节连续区域。

调用公式为(char *)malloc(sizeof(char) *  20);


calloc函数与malloc函数相似,都是分配一块内存给指针。形参为参数个数和申请地址的单位元素长度。

调用公式为(char * )calloc(20,sizeof(char));


realloc函数是给一个已经分配了地址的指针重新分配空间;

加入我们已经定义过了一个名为ptr的指针,并用malloc或calloc函数进行过了空间分配。

调用公式为(char  *)realloc(ptr,sizeof(char)* 50);


malloc、calloc、realloc函数之间的区别:

首先是realloc,它与其他两个函数不同,是给已经分配了空间的指针进行空间再分配。也可以理解为指针地址的拓展和缩小。如果重新分配的空间比原空间要大,数据不会发生变化。但如果重新分配的空间比原空间小,会发生数据丢失。而且拓展或缩小所分配的空间可能不是同一块空间。


malloc函数不会对分配的内存空间进行初始化,但calloc会。使用malloc函数时,刚开始分配的的值时是空地址,但执行过一段时间以后,所分配的空间中会出现各种各样的数据。

calloc函数会对分配的内存进行初始化,字符等初始化所有数据初始化为0;指针变量分配的内存会被初始化成地址NULL,整数的初始化为浮点型。

0 0
原创粉丝点击