zoukankan      html  css  js  c++  java
  • 指针-3(动态内存分配)

    专题:

    动态内存分配(重点)

        传统数组的缺点:

            1.数组长度必须事先制定,且只能是常数,不能是变量

              例:int a[5];//OK

                int len = 5; int a[len]; //error

            2.传统形式定义的数组,该数组的内存程序员无法手动释放

             在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放

            3.数组的长度一旦定义,其长度就不能再改变。数组的长度不能在函数运行的过程中动态的扩充或缩小

            4.A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法在被其它函数使用

             传统方式定义的数组不能跨函数使用

          为什么需要动态分配内存

            动态数组很好的解决了传统数组的4个缺陷;传统数组也叫静态数组

    /*
        malloc 是memory(内存)allocate(分配)的缩写
    */
    int main()
    {
        int i = 5; //9行
        int * p = (int *)malloc(4); //10行
        /*
            1. 要使用malloc函数,必须添加malloc.h这个头文件
            2. malloc函数只有一个形参,并且形参是整型
            3. 4表示请求系统为本程序分配4个字节
            4. malloc函数只能返回第一个字节的地址
            5. 10行分配了8个字节,p变量占4个字节,p指向的内存也占四个字节
            6. p本身所占的内存是静态分配的,p所指向的内存是动态分配的
        */
        *p = 5; //*p 代表的就是一个int变量, 只不过*p这个变量的内存分配方式和9行的i变量分配的方式不同
        free(p); //free(p)表示把p所指向的内存释放掉  p本身的内存静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放
        printf("同志们好!
    ");
        return 0;
    }

     int * p = &i; //int * p;p = &i;

    malloc的第二种用法
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h> //malloc头文件
    
    void f(int *q )
    {
        //*p = 200; //error
        //q = 200;//error,因为q是地址
        //**q = 200; //error,因为*q是整型变量。而*只能加在指针变量的起前面
        *q = 200;
        //free(q);  //把q所知的内存释放掉,本语句必须注释掉,否则会导致20行代码出错
    }
    
    int main()
    {
        int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数;( p指向的是四个字节
        *p = 10;
        printf("%d
    ", *p);
        f(p);  //p是int *类型
        printf("%d
    ", *p); //20行
        return 0;
    }

     

       

      动态内存分配举例_动态数组的构造

    #include <malloc.h>
    
    int main()
    {
        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;;
    }

     

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

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

            静态内存是在栈分配的

      

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

            动态内存是在堆分配的

          跨行使用内存的问题

  • 相关阅读:
    HDU 1165 Eddy's research II (推公式)
    HDU 1394 Minimum Inversion Number (线段树&&暴力)
    HDU 2845 Beans (最大不连续子序列和)
    CodeForces 369A Valera and Plates( 水)
    HDU 1241 Oil Deposits(dfs)
    hdu 1016 Prime Ring Problem(dfs)
    hdu 5138 CET-6 test(水)
    ZOJ 3693 Happy Great BG(卡精度)
    HDU 1028 Ignatius and the Princess III(dp 母函数)
    CodeForces 432B Football Kit(水)
  • 原文地址:https://www.cnblogs.com/spore/p/11038614.html
Copyright © 2011-2022 走看看