一、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)返回旧空间首地址。