分析两种动态分配二位数组的方法,其原理一致。
0. 动态分配一维数组int a[rows]
#include <stdlib.h>
int main{void}
{
    ...
    int *a = (int *)malloc(rows * sizeof(int));//分配一段内存,存放rows个int型的数据
    
    ...
}
 1. 动态分配内容不一定连续的二维数组a[rows][columns]
#include <stdlib.h>
int main{void}
{
    ...
    int **a = (int **)malloc(rows * sizeof(int *));//分配一个指针数组有rows个元素,数组的每一个元素是一个数组指针
    
    for(i = 0;i < rows; i++)
    {
      a[i] = (int *)malloc(columns * sizeof(int));//为每数组指针分配columns个存放int型数据的内存
    }
    ...
}
 2. 分配连续的二维数组a[rows][columns]
#include <stdlib.h>
int main{void}
{
    ...
    int **a = (int **)malloc(rows * sizeof(int *));//分配一个指针数组有rows个元素,数组的每一个元素是一个数组指针
    
    a[0] = (int *)malloc(rows * columns * sizeof(int));//分配存放rows * columns个int型数据的数组,a[0]加1则移动1个int型数据的空间,此处a[0]表示int型数据的地址
    
    for(i = 1;i < rows; i++)
    {
      a[i] = a[0] + i * columns;//每行有columns个int型元素,所以rows每加1,地址加i * columns 
    }
    ...
}