美文网首页
C、C++ 动态分配内存 malloc calloc reall

C、C++ 动态分配内存 malloc calloc reall

作者: Kael_Zhang的安卓笔记 | 来源:发表于2023-06-28 15:38 被阅读0次

    为什么动态分配内存?

    int a[5]; //ok
    int length = 5;
    int a[length];  //不ok
    
    • 数组的长度必须事先指定,而且只能是常量,不能是变量
    • 因为数组长度只能是常量,所以它的长度不能在函数运行的过程当中动态地扩充和缩小
    • 对于数组所占内存空间无法手动释放,只能在函数运行结束后由系统自动释放,所以在一个函数中定义的数组只能在该函数运行期间被使用
    • 动态分配内存就不存在以上问题,因为动态内存是手动释放,理论上可以在任意时刻释放,在释放之前,即便是函数运行结束,其他函数仍可继续使用它。(程序运行结束时系统为该程序分配的所有内存空间都会被释放)

    动态分配内存的使用

    • 动态分配内存主要涉及到 malloc calloc realloc 三个函数
    • 动态分配内存必须指针接收
    • 动态分配内存返回类型为 void *
    • 动态分配内存可能失败 返回NULL ,使用前应判空
    • 动态分配的内存不会自动释放,必须手动释放
    • malloc ,分配内存
    int *p = (int *)malloc(10); //动态申请10个字节的大小的连续空间,返回的是首地址
    
    • calloc,分配内存并初始化为0,
    int *p = (int *)calloc(10,2); //动态申请 10*2 个字节的大小的连续空间,并初始化为0,返回的是首地址
    
    • realloc,动态调整已分配的内存,返回调整后的新分配的连续空间的首地址,同时将调整之前的地址中的值复制到新地址中
    int *p = (int *)malloc(20 * sizeof(int));
    int *p1 = (int *)realloc(p, 10*sizeof(int)); 
    //扩大已分配的内存,返回已扩大后的新分配的连续空间的首地址,同时将扩大之前的地址中的值复制到新地址中
    

    动态分配内存的释放

    • 动态分配的内存不会自动释放,必须手动释放
    # include <stdio.h>
    # include <stdlib.h>
    int main(void)
    {
        int *p = malloc(sizeof(int));
        *p = 10;
        printf("p = %p\n", p);
        free(p);
        printf("p = %p\n", p);
        p = NULL;
        return 0;
    }
    

    释放前后,p 所指向的内存地址是一样的。所以释放后 p 所指向的仍然是那块内存空间。既然指向的仍然是那块内存空间,那么就仍然可以往里面写数据。可是释放后该内存空间已经不属于它了,该内存空间可能会被分配给其他变量使用。如果其他变量在里面存放了值,而现在用 p 往里面写入数据就会把那个值给覆盖,这样就会造成程序错误。所以当指针变量被释放后,要立刻把它的指向改为 NULL。

    • 只有动态创建的内存才能用 free 把它释放掉,静态内存是不能用free释放的。静态内存只能由系统释放

    相关文章

      网友评论

          本文标题:C、C++ 动态分配内存 malloc calloc reall

          本文链接:https://www.haomeiwen.com/subject/oemoydtx.html