malloc和free
前提概要
C函数库中的malloc和free分别用于执行动态内存分配和释放
以上两个函数在头文件stdlib.h中声明
函数原型
void *malloc ( size_t size );
void free ( void *pointer );
malloc函数
作用
在内存的动态存储区中分配一个长度为size的连续空间
传参
无符号整形数
返回值
指向所分配连续存储域起始地址的指针
注意
函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针,在调用该函数时应该检测返回值是否为NULL,确保非空之后再使用非常重要
malloc所分配的内存是一块连续的空间
malloc实际分配的内存空间可能会比你请求的多一点,但是这个行为只是由编译器定义
malloc不知道用户所需内存存储的数据类型,故malloc返回一个void *的指针(可以转换为任意类型指针)
free函数
前提概要
内存空间有限,不能无限制分配内存,故程序要尽量节省资源,当分配的内存空间不用时,需释放
作用
释放指针(传参值为指针)指向的内存空间
传参
传参可以是 NULL,或者 malloc、relloc、calloc 返回值
传参为NULL不会产生任何效果,但不会报错
calloc和realloc与malloc的区别
calloc和realloc的原型
void *calloc ( size_t num_elements, size_t element_size );
void *realloc (void *ptr, size_t new_size );
calloc和malloc区别
calloc返回内存空间指针前,会将内存空间初始化为0,malloc不会初始化(有时需要用memset进行初始化)
传参方式不同,calloc的参数包括所需元素的数量和每个元素的大小,再根据两个值换算进行内存空间分配
realloc函数
作用
用于修改原先已分配内存块的大小,可使一块内存扩大或缩小
传参说明
当传参*ptr为空,即*ptr = NULL,则同malloc
当传参*ptr非空
若nuw_size < size,即缩小*ptr所指内存空间,该内存块尾部部分被拿掉,剩余部分空间的内容依然保留
若nuw_size > size,即扩大*ptr所指内存空间,如果原先内存尾部有足够的扩大空间,则直接在原先的内存块尾部新增内存,如果原先的内存尾部空间不足,或原先的内存块无法改变大小,realloc将重新分配另一块nuw_size大小的内存,并把原先那块内存的内容复制到新的内存块上,因此,使用realloc后就应该改用realloc返回的新指针
注意
realloc分配失败,ptr 指向的内存不会被释放,它的内容也不会改变,依然可以正常使用
参考例程
int *p1,*p2; p1 = (int*)malloc(size * sizeof(int)); p2=p1; …… free(p1); /*或者free(p2)*/