malloc
void* malloc(size_t size)
在堆区上申请一块连续可用的空间,空间不会初始化。
如果开辟成功就会返回开辟好的空间的指针,如果开辟失败则返回NULL指针。
返回值的类型是 void* ,malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者自己来决定。
int* p = (int*)malloc(5*sizeof(int));
free函数
void free(void* ptr)
申请的空间不想使用了,就需要释放空间,可以使用free函数释放。
free函数只能用来释放动态开辟的内存,不能对同一块动态内存多次释放,也不能只释放动态开辟内存的一部分。
如果参数ptr是空指针,则函数什么都不会做。
free过后需要给参数ptr赋值空指针。
如果没有使用free函数释放,在程序退出的时候也会由操作系统回收(最好手动用free函数释放内存)。
malloc函数和free函数声明在<stdlib.h>头文件中。
calloc
void* calloc(size_t num, size_t size)
申请一块num个大小为size的元素的空间,申请得到的空间默认初始化为0。
其功能和malloc相似。
realloc
vodi* realloc(viod* ptr, size_t size)
//ptr为要调整的内存地址
//size为扩容后总的空间大小,不是在原空间后追加的大小
realloc函数可以对动态开辟内存大小的调整。
返回的值为调整后的内存的起始位置。
realloc在调整内存空间的是存在两种情况:
情况1:原有空间之后有⾜够⼤的空间,在原空间后面直接追加空间,返回返回原来ptr的起始位置。
情况2:原有空间之后没有⾜够⼤的空间,在内存中找到一块新的且足够大小的空间,将旧的空间的内容拷贝到新的空间中,同时将旧的空间释放,返回新空间的起始地址。
如果扩容失败,则返回空指针NULL。
因此需要一个新的参数p来接收扩容后的空间,判定后不为空指针再赋值给ptr。赋值后不能使用free函数将参数p释放,只能将参数p指向空指针。
当realloc中传的参数为空指针时,其功能等价于malloc,可用来开辟一块连续的空间。