堆内存申请函数
本节只需要读者了解内存的操作函数API以及使用内存操作函数需要包含stdlib.h头文件,并牢记使用内存申请函数后必须要使用free( )函数释放内存空间。后续章节中会有具体的案例使用以下所讲的堆内存申请函数。堆内存申请函数如下。
(1)malloc()函数
malloc()函数原型如下:
void* malloc(size_t size);
malloc()函数返回值类型为void*,函数参数是size_t,size_t是系统对unsigned int类型的重定义。
malloc()函数的功能是分配size字节大小的内存空间,申请成功后返回指向该内存空间的指针,若申请内存空间失败,返回值为NULL。通常在申请内存时使用if语句确认内存是否申请成功。
(2)calloc()函数
calloc()函数函数原型如下。
void* calloc(size_t nmemb,size_t size);
calloc()函数的返回值类型为void*,第1个参数nmemb代表分配数据类型的个数,第2个参数size代表分配的每个内存单元的大小。
calloc()函数用于申请大小为size的元素,一共有nmemb个元素的连续存储空间。如果calloc()函数调用成功,返回指向申请内存空间的指针,否则返回NULL。与malloc()函数相比,calloc()函数在申请内存后会自动将申请的内存空间元素的值初始化为0。
(3)realloc()函数
realloc()函数原型如下:
void* realloc(void *ptr, size_t size);
realloc()函数返回值类型为void ,第1个参数ptr指向一个已分配好的内存空间,通常指向malloc()函数或caloc()函数分配好的内存空间,第2个参数size表示要申请的内存空间的大小。当malloc()函数或caloc()函数分配的内存空间不够使用时,就可以使用realloc()函数进行内存扩充。
如果ptr为空,则功能与malloc()函数相同。当指向的是一块已经分配的内存时,如果size小于或等于ptr指向内存空间的大小时会造成数据丢失;如果size大于ptr指向的内存空间大小时,那么系统将试图从原来内存空间的后面直接扩大内存至size,若能满足需求,则内存空间地址不变,如果不满足,则系统重新从堆上分配一块大小为原来内存空间加上size大小的内存空间,同时将原来的内存空间的内容依次复制到新的内存空间上,原来的内存空间被释放;如果size为0,ptr指向的内存空间将会被释放并返回空指针。