malloc/calloc/realloc的区别

一、malloc/calloc/reallloc和free的介绍

1.malloc函数

malloc函数可以从堆上火的指定字节的内存空间

函数原型:
   void* malloc(int n);
参数释义:
   n:申请空间大小

其中,形参n为要求分配的字节数。如果函数执行成功,malloc函数返回火的内存空间的首地址;如果函数执行失败,则返回值为NULL。
由于malloc函数值的类型为void型指针,因此,可以将其值类型转化后赋给任意类型指针,可以通过操作该类型指针来操作从堆上获得的内存空间。
注意:通过malloc函数分配得到的内存空间是未初始化的,必须使用memset函数来初始化。

2.calloc函数

calloc函数的功能与malloc函数的功能相似,都是从堆分配内存。

函数原型:
   void* calloc(int n,int size);
参数释义:
   n:申请空间的个数
   size:单个类型的大小
注意:calloc函数最后申请的空间大小为n和size相乘

calloc函数的返回值类型为void指针类型。如果函数执行成功,函数从堆上获得n*size的字节空间,并返回该空间的手首地址;如果函数执行失败,返回值为NULL。
calloc函数与malloc函数不同之处在于:calloc函数得到的内存空间是进过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。

3.realloc函数

realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能。

函数原型:
void* realloc(void* p,int n);
参数释义:
   n:空间的大小
   p:堆上已经存在的空间的地址

其中,指针p必须为指向堆内空间的指针,既由malloc函数、calloc函数或realloc函数分配空间的指针。
realloc函数将指针p指向的内存空间的大小改变为n字节。如果n小于或等于p之前指向的空闲的大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。
注意:realloc函数分配的空间也是未初始化的。

4.free函数

free函数用来释放动态开辟的内存

函数原型:
   void free(void* ptr);
参数释义:
   ptr:堆上已经存在的空间的地址

如果参数ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的。
如果参数ptr是NULL指针,那么函数什么是都不做。
注意:使用malloc函数、calloc函数和realloc函数分配的内存空间都要使用free函数或指针参数为NULL的realloc函数来释放。

二、malloc/calloc/realloc的区别

相同点:

1.都是从堆上申请空间;
2.都需要对返回值判空;
3.都需要用户free释放;
4.返回值类型相同(都是void*);
5.都需要类型转化;
6.底层实现是一样的,都需要开辟多余的空间,用来维护申请的空间。

不同点:

1.函数名字不同,参数类型不同;
2.calloc函数会对申请空间初始化,并且初始化为0;
3.malloc函数申请空间必须使用memset进行初始化;
4.realloc函数是对已经存在的空间进行调整,当第一个参数传入NULL的时候和malloc函数一样,其调整分为两种请况:

A.调整的空间比原有空间大
    a.大了一点:多出来的空间小于下面空闲的空间
      调整方法:
      (1)直接延伸申请空间;
      (2)返回空间首地址。
    b.打了很多:多出来空间大于下面空闲空间
    调整方法:
    (1)重新开辟新空间;
    (2)将旧空间的内容拷贝到新空间中;
    (3)释放旧空间;
    (4)返回新空间的首地址。
B.调整的空间比原有空间小
   调整方法:
   (1)将原有空间缩小;
   (2)返回旧空间首地址。

你可能感兴趣的:(malloc/calloc/realloc的区别)