11动态数组

11动态数组

  • 从堆(heap)上分配

    在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的,动态内存的生存期由程序员自己来决定

  • 分配内存的两大主要方式

    • void* malloc(unsigned int size);

      向系统申请大小为size的内存块

      把首地址返回,若申请不成功则返回NULL

    • 例如:

      1
      2
      3
      int *pi = NULL;

      Pi = (int *)malloc(sizeof(int));
    • void* calloc(unsigned int num,unsigned int size);

      向系统申请num个size大小的内存块

      把首地址返回,若申请不成功则返回NULL

    • 例如:

      1
      2
      3
      float *pf = NULL;

      pf =(float *)calloc(10,sizeof(float));

    需要头文件:

    #include <stdlib.h>

    #include <alloc.h>

    注:void* 类型的指针可以指向任意类型的变量,通常强转(Type*)为其他类型

  • 清除内存分配:void free(void* p);

    释放由malloc()calloc()申请的内存块

    • p是指向此块内存的指针

    • free时系统标记此块内存为未占用,可被重新分配

  • 改变分配内存的存储空间方式:

    void* realloc(void* p , unsigned int size);

    • 改变原来分配的存储空间的大小

      • p是指向此块内存的指针,size是新内存块的大小

      • 函数返回新分配存储空间首地址,与原来分配的首地址不一定相同

  • 一维动态数组的创建

    创建一个长度为n的动态数组并输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    p=(int*)malloc(n*sizeof(int));
    //p=(int *)calloc(n,sizeof(int));
    if(p==NULL)//确保指针使用前是非空指针
    {
    printf("No enough memory!\n");
    exit(1);
    }
    for(int i=0;i<n;i++)
    {
    scanf("%d",&p[i]);
    }
    free(p);//释放向系统申请的存储空间
  • 二维动态数组的创建

    创建一个长度为n的动态数组并输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    p=(int *)malloc(n*m*sizeof(int));

    //p=(int*)calloc(n*m,sizeof(int));
    //得到的p为int* 类型,所以为列指针
    if(p==NULL)//确保指针使用前是非空指针
    {
    printf("No enough memory!\n");
    exit(1);
    }
    for(int i=0;i<n;i++)
    {
    for(int j=0;j<m;j++)
    {
    scanf("%d",&p[i*n+j]);
    }
    }
    free(p);//释放向系统申请的存储空间