当前位置 博文首页 > 维欣~fighting?:关于内存分配函数的那些事

    维欣~fighting?:关于内存分配函数的那些事

    作者:[db:作者] 时间:2021-09-22 16:58

    一、malloc函数

    1、使用完毕需手动释放内存空间
    2、从堆上分配
    3、返回值类型为void*,如果内存分配失败就会返回NULL
    则用malloc函数开辟动态内存后一定要判断函数返回值是否为NULL
    4、函数原型:void* malloc (size_t);
    5、用法举例:

    int *p;
    p=(int*)malloc(30*sizeof(int));
    

    开辟了30个int类型的空间,然后把p指向这个空间的位置。在这里的指针是指向第一个int值,并非我们所有开辟的30个int的空间
    因为malloc返回的是void*,所以malloc前要用(int *)进行强转。

    二、calloc函数

    1、函数原型:void* calloc(size_t num,size_t size);
    2、开辟的内存空间是一个数组空间,有num个元素,每个元素有size个字节,内存大小为numsize
    3、返回值类型为 void*,返回的地址为开辟空间的首地址,如果开辟失败,则返回NULL。
    4、与malloc的区别是:
    ① calloc()会在返回地址之前,将所申请的内存空间中的每个字节都初始化为0.
    ② calloc()会在分配内存的同时清楚内存
    例如:int *p = calloc(3,sizeof(int));分配了3
    4=12个字节

    三、realloc函数

    1、函数原型:void *realloc(void *ptr,size_f size);
    ptr是指向需要修改的内存块的指针,size是请求修改的大小
    2、realloc用来修改已分配的内存块的大小
    3、如果调整成功,返回值是调整大小后内存的起始位置;如果失败,则返回NULL,所以要对返回值进行判空。
    4、在扩大内存空间时会出现的两种情况:
    (1)ptr所指向的内存后有足够的内存空间用来扩展
    在这里插入图片描述
    (2)ptr所指向的内存后没有足够的内存空间用来扩展
    则在堆上重新找一个大小合适的连续空间来使用,这样函数返回的是一个新的内存地址
    如果新的内存空间申请成功,则会将ptr所指向的内存中的内容拷贝到新的内存空间中,ptr所指向的内存会被释放,返回新的内存地址;如果不成功,ptr所指向的内存不会被释放,函数返回NULL。
    在这里插入图片描述
    5、p = realloc(ptr,size)函数返回值不为空时,释放内存不需要写free(ptr),只需要写free(p)
    6、申请的内存空间不会进行初始化

    四、free函数

    1、用来释放动态开辟的内存
    2、函数原型:void free(void *ptr);
    指针参数是指向malloc等函数动态申请的内存地址,这块内存释放后会返还给堆,虽然指针指向这块区域,但可以重新分配这块数据
    3、一般来说,free释放的是最新开辟的一个内存空间
    如果程序中malloc了,但是没有free,则会造成内存泄漏(即在程序运行过程中,系统会一直被申请内存,造成可用内存不断减少)
    4、在free之后,需要将ptr再次置空,即ptr = NULL;,如果不置空,后面程序如果通过ptr会再次访问到已经释放/无效的/已经被回收再利用的内存。
    5、free不能同时释放一块内存。

    在使用以上函数时,需要加头文件#include <stdlib.h>

    cs
    下一篇:没有了