动态分配二维数组

动态创建

  • 动态数组是指在声明时没有确定数组大小的数组;当要用它时,C语言中用malloc语句重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。

  • 有时根据题意需得根据输入的二维数来动态的创建二维数组,那么此时就不能想以前一样直接定义多少行多少列了。因为不知道行列多少,假如设定太大浪费空间,申请太小完成不了程序的数据存储。因此需要合理的开辟二维空间。

    动态数组与静态数组的对比

对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!
对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

遵循原则

申请的时候从外层往里层,逐层申请;
释放的时候从里层往外层,逐层释放。

构建所需指针

对于构建一维动态数组,需要一维指针;
对于二维,则需要一维,二维指针;
三维需要一,二,三维指针;
依此类推。

  • 以下的两种方法都可以建立动态的二维空间数组。

方法一:

  • 使用指针动态分配

      int i,j;
      int r,c;
      int **a;  //创建二维指针来指向数组
      scanf("%d%d",&r,&c);
      a  = (int **) malloc(sizeof(int *) * r);//注意申请的指针格式
      for (j=0;j<r;j++){
      a[j] = (int *) malloc(sizeof(int) * c);
      ……
      ……
      }
    
  • 释放为:

      for (j=0;j<r;j++)
       free(a[j]);//先释放一维指针
       free(a);//最后释放我二维指针
    

方法二:

  • 建立链表来存放二维数组。

      typedef struct arr
      {
          int *array;
      }arr;
      main()
      {
          arr *array1;
          int rowx,rowy;
          int i,j,k=0;
          scanf("%d %d",&rowx,&rowy);
          array1=(arr *)malloc(sizeof(arr)*rowx);//创建链表数组
          for(i=0;i<rowx;i++)
                      //再在每一个链表中创建一维数组,这样整体就构成二维数组
              array1[i].array=(int *)malloc(sizeof(int)*rowy);
      ……
      ……
    
  • 释放同上:

      for (j=0;j<rowx;j++)
       free(array1[j].array);
       free(array);
    
      }
    

示例

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int n1,n2,n3;
    int ***array;
    int i,j,k;

    puts("输入一维长度:");
    scanf("%d",&n1);
    puts("输入二维长度:");
    scanf("%d",&n2);
    puts("输入三维长度:");
    scanf("%d",&n3);

    array=(int***)malloc(n1*sizeof(int**));//第一维
    for(i=0; i<n1; i++)
    {
        array[i]=(int**)malloc(n2*sizeof(int*)); //第二维
        for(j=0;j<n2;j++)
        {
            array[i][j]=(int*)malloc(n3*sizeof(int)); //第三维
            for(k=0;k<n3;k++)
            {
                array[i][j][k]=i+j+k+1;
                printf("%d\t",array[i][j][k]);
            }
            puts("");
        }
        puts("");
    }
    for(i=0;i<n1;i++)
    {
        for(j=0;j<n2;j++)
        {
            free(array[i][j]);//释放第三维指针
        }
    }
    for(i=0;i<n1;i++)
    {
        free(array[i]);//释放第二维指针
    }
    free(array);//释放第一维指针

    return 0;
}