|
"2次元配列"の動的確保はできませんが、
一次元配列を分割して、似たようなことはできます。
イメージ的には↓のようなのが近いと思いますが、array[i*m + j]のようにアクセスする方が簡単かもしれません。
#include <stdio.h>
#include <stdlib.h>
void print_array(int **array, int num_of_line, int num_of_col)
{
int i, j;
for (i = 0; i < num_of_line; i++) {
for (j = 0; j < num_of_col; j++) {
printf("%4d", array[i][j]);
}
putchar('\n');
}
}
int main(void)
{
int i, j, n, m;
int *array, **array2;
char buf[256];
do {
printf("行数\n>");
fgets(buf, sizeof buf, stdin);
} while (sscanf(buf, "%d", &n) != 1);
do {
printf("列数\n>");
fgets(buf, sizeof buf, stdin);
} while (sscanf(buf, "%d", &m) != 1);
array = malloc(sizeof(int) * n * m);
array2 = malloc(sizeof(int *) * n); /* 二次元配列の各行の先頭へのポインタの配列を確保する */
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
array2[i] = array + i * m;
do {
printf("array2[%d][%d] = ", i, j);
fgets(buf, sizeof buf, stdin);
} while (sscanf(buf, "%d", &array2[i][j]) != 1);
}
}
print_array(array2, n, m);
return 0;
}
あるいは、行の数だけのポインタ配列を先に確保して
for (i = 0; i < n; i++) {
array2[i] = malloc(sizeof(int) * m)
}
としてもarray2[i][j]で二次元配列と同じようにアクセスできます。
ただし、この場合は、全く同じようには扱えません。
例えば、通常の二次元配列
vector[3][4]
では、vector[0][5]は、vector[1][2]と同じですが(あまりやらないけど)、
行毎にmallocする方法では、違います。
|