c语言如何动态创建二维数组

如题所述

既然是动态创建,那么,所创建的二维数组的行、列数应该具有“普适”性,即,应由“用户”确定二维数组的规模。这是有难度的。因为,二维数组要牵扯行指针,且需要固定每行的列元素个数,用这种思路就没有办法达到“普适”。
为此,必须清醒地知道,所谓二维数组,其元素在内存中依然是以一维的方式存放的。说实话,二维数组本质上是不存在的。
既然如此,那么,“构造”一个所谓的二维数组,只要能提供足够实用的函数(工具)操作这个二维数组就可以了。
综上,接受由用户决定的二维数组行、列值,申请一个一维数组的空间,按照二维数组方式进行定位和操作就可以了。
为简便起见,我用如下定义,你可以更改里面的类型,以适应自己的需要:
typedef int USER_TYPE;

// 定义一个控制二维数组(矩阵)的“控制头”,由三个成员组成

typedef struct MATRIX
{
USER_TYPE *data; // 真正用来存储二维数组元素的空间

int Row; // 二维数组行数

int Col; // 二维数组列数

}MATRIX;

MATRIX *initMatrix(int row, int col); // 初始化二维数组

USER_TYPE getElementAt(MATRIX matrix, int i, int j); // 取得指定下标的元素

void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val); // 给指定下标的元素赋值
void destroyMatrix(MATRIX *matrix); // 销毁二维数组

void destroyMatrix(MATRIX *matrix)
{
free(matrix->data);
free(matrix);

}

void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val)
{
matrix.data[i*matrix + j] = val;

}

USER_TYPE getElementAt(MATRIX matrix, int i, int j)
{
return matrix.data[i*matrix.Col + j];

}

MATRIX *initMatrix(int row, int col)
{
MATRIX *mp;

mp = (MATRIX *)malloc(sizeof(MATRX));
mp->data = (USER_TYPE *)malloc(sizeof(USER_TYPE) * row * col);
mp->Row = row;
mp->Col = col;

return mp;

}
把上面的函数当成工具,完成二维数组初始化、赋值、取值等一系列操作,如果需要比较,还需要编写比较的函数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-08

(1)已知第二维

char (*a)[N];//指向数组的指针 
a = (char (*)[N])malloc(sizeof(char *) * m); 
printf("%d\n", sizeof(a));//4,指针 
printf("%d\n", sizeof(a[0]));//N,一维数组 
free(a);

(2)已知第一维

char* a[M];//指针的数组 int i; 
for(i=0; i<M; i++) 
a[i] = (char *)malloc(sizeof(char) * n);
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针 
for(i=0; i<M; i++)    
free(a[i]);

(3)两维都未知

char **a; 
int i; 
a = (char **)malloc(sizeof(char *) * m);//分配指针数组 
for(i=0; i<m; i++) { 
a[i] = (char *)malloc(sizeof(char) * n);//分配每个指针所指向的数组} 
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针 
for(i=0; i<m; i++) { 
free(a[i]); 
}
free(a);

第2个回答  2014-04-08
int nx = 5;
int ny = 6;

int ** a = new int*[nx];
for (int i=0;i<nx;i++)
{
a[i] = new int[ny];
}

nx,ny就是动态变量