zoukankan      html  css  js  c++  java
  • c/c++动态分配内存和malloc的使用

    c/c++动态分配内存 

    为什么需要动态分配内存

    ---很好的解决的了传统数组的4个缺陷

     

    动态内存分配举例

    ---动态数组的构造

     

    使用动态数组的优点:   
    1. 动态数组长度不需要事先给定;
    2. 内存空间可以手动释放;
    3. 在程序运行中, 动态内存空间大小可以通过realloc函数手动扩充或缩小
       

     静态内存和动态内存的比较  


      静态内存是由系统自动分配,有系统自动释放

      静态内存是在栈分配的

      动态内存是由程序员手动分配,手动释放,动态内存是在堆分配的

     

    动态内存和静态内存的比较

    静态内存是由系统自动分配,由系统自动释放
    静态内存是在栈分配的

    动态内存是由程序员手动分配,手动释放
    动态内存是在堆分配的

     

    难点

    /*
        2009年11月17日10:21:31
        malloc 是 memory(内存) allocate(分配)的缩写
    
    */
    # include <stdio.h>
    # include <malloc.h>  //不能省
    
    int main(void)
    {
        int i = 5; //分配了4个字节 静态分配   11 行
        int * p = (int *)malloc(4); //12行
            /*
                1. 要使用malloc函数,必须添加malloc.h这个头文件
                2. malloc函数只有一个形参,并且形参是整型
                3. 4表示请求系统为本程序分配4个字节
                4. malloc函数只能返回第一个字节的地址
                5. 12行分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节
                6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的       
            */
    
        *p = 5; //*p 代表的就是一个int变量, 只不过*p这个整型变量的内存分配方式和11行的i变量的分配方式不同
        free(p); //freep(p)表示把p所指向的内存给释放掉  p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 
        printf("同志们好!
    ");
    
        return 0;
    }
    malloc的用法:
    demo1 .
    # include <stdio.h>
    # include <malloc.h>
    
    void f(int * q)
    {
        //*p = 200; //error
        //q = 200;
        //**q = 200;  //error
        *q = 200;
        //free(q);  //把q所指向的内存释放掉  本语句必须的注释掉,否则会导致第20行的代码出错
    }
    
    int main(void)
    {
        int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数
        *p = 10;
    
        printf("%d
    ", *p);  //10
        f(p);  //p是int *类型
        printf("%d
    ", *p);  //200    第20行
    
        return 0;
    }

    demo2.

    # include <stdio.h>
    # include <malloc.h>
    
    int main(void)
    {
    //    int k;
        int * p = (int *)malloc(4);  
            /*
                malloc函数的返回值是void *
                void * 也叫干地址  所谓干地址就是无实际意义的地址
            */
    
        free(p); //把p指向的内存释放
    
        return 0;
    }
    动态一维数组示例:

    # include <stdio.h>
    # include <malloc.h>
    
    int main(void)
    {
        int a[5]; //如果int占4个字节的话,则本数组总共包含有20个字节,每四个字节被当做了一个int变量来使用
        int len;
        int * pArr;
        int i;
    
        //动态的构造一维数组
        printf("请输入你要存放的元素的个数: ");
        scanf("%d", &len);
        pArr = (int *)malloc(4 * len);  //第12行  本行动态的构造了一个一维数组, 该一维数组的产度是len, 该数组的数组名是pArr, 该数组的每个元素是int类型  类似于 int pArr[len];
        
        //对一维数组进行操作,  如:对动态一维数组进行赋值
        for (i=0; i<len; ++i)
            scanf("%d", &pArr[i]);
    
        //对位一维数组进行输出
        printf("一维数组的内容是:
    ");
        for (i=0; i<len; ++i)
            printf("%d
    ", pArr[i]);
        
        free(pArr); //释放掉动态分配的数组
        
    
        return 0;
    }

    示意图:


  • 相关阅读:
    树形地铁系统[树的最小表示]
    156. 矩阵[二维的hash]
    兔子与兔子
    滑动窗口【单调队列入门题】
    【YBTOJ】生日相同
    【YBTOJ】移位包含
    【YBTOJ】【HDUOJ 3085】逃离噩梦
    【YBTOJ】立体推箱子
    【CodeForces 1408F】Two Different
    【Luogu P3338】[ZJOI2014]力
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3813106.html
Copyright © 2011-2022 走看看