指针-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("同志们好!\n");
    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\n", *p);
    f(p);  //p是int *类型
    printf("%d\n", *p); //20行
    return 0;
}

 

   

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

 

#include <malloc.h>

int main()
{
    int a[5]; //如果int占4个字节的话,则本数组共包含有20个字节,每四个字节被当做了一个int变量来使用
    int len;
    int * pArr;
    int i;

    //动态的构造一维数组
    printf("请输入你要存放的元素的个数:\n");
    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("一维数组的内容是\n");
    for(i=0;i<len;i++)
        printf("%d\n",pArr[i]);

    free(pArr);
    return 0;;
}

 

 

 

 

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

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

        静态内存是在栈分配的

 

  

 

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

 

        动态内存是在堆分配的

 

      跨行使用内存的问题

posted @ 2019-06-17 11:02  小孢子  阅读(414)  评论(0编辑  收藏  举报