通常利用数组指针来创建动态二维数组,但是地址是不连续的,如果想创建连续地址动态二维数组则没有好办法,下面的方法可以实现地址连续,但是需要固定列数,行数是动态创建的。
// 定义有1000个整数的数组类型,此时a只表示类型,不占空间,列数须要初始设定
int (*a)[1000];
a = (int (*)[1000])malloc(500 * 1000 * sizeof(int)); // 分配空间,这里500是行数
memset(a, 0, 500 * 1000 * sizeof(int)); // 清零
/*
二维数组表示为如下:
a[0] = {a[0][0], a[0][1], a[0][2], ..., a[0][999]}
a[1] = {a[1][0], a[1][1], a[1][2], ..., a[1][999]}
a[2] = {a[2][0], a[2][1], a[2][2], ..., a[2][999]}
...
a[499] = {a[499][0], a[499][1], a[499][2], ..., a[499][999]}
*/
a[0][10] = 8;
free(a); // 释放空间
另外注意区别以下定义:
int* a[1000]; // 表示创建包含1000个整型指针的数组,已分配存储空间
int (*a)[1000]; // 定义了一个有1000个整数的数组类型,未分配存储空间