行列を割り当てたい。
これが唯一のオプションです:
int** mat = (int**)malloc(rows * sizeof(int*))
for (int index=0;index<row;++index)
{
mat[index] = (int*)malloc(col * sizeof(int));
}
まあ、あなたは私たちに完全な実装を与えなかった。私はあなたが意味したと思います。
int **mat = (int **)malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) mat[i] = (int *)malloc(cols * sizeof(int));
ここに別のオプションがあります:
int *mat = (int *)malloc(rows * cols * sizeof(int));
次に、次を使用して行列をシミュレートします
int offset = i * cols + j;
// now mat[offset] corresponds to m(i, j)
行優先順および
int offset = i + rows * j;
// not mat[offset] corresponds to m(i, j)
列優先順。
これら2つのオプションの1つは、実際にはCで行列を処理する方法として推奨されます。これは、行列がメモリに隣接して格納され、 参照の局所性 のメリットがあるためです。基本的に、CPUキャッシュはあなたにとってとても幸せです。
他の回答はすでにこれらをカバーしていますが、完全を期すために、comp.lang.c FAQに関連エントリがあります。
あなたにできることは
int (*mat)[col];
mat=(int (*)[col])malloc(sizeof(*mat)*row);
そして、この新しい行列をmat [i] [j]として使用します
どうですか:
int* mat = malloc(rows * columns * sizeof(int));
また、callocを使用することもできます。これにより、マトリックスがさらにゼロ初期化されます。署名は少し異なります:
int *mat = (int *)calloc(rows * cols, sizeof(int));
あなたはcanそれをmallocへの1回の呼び出しに折りたたみますが、2D配列スタイルを使用したい場合でも、forループが必要です。
int** matrix = (int*)malloc(rows * cols * sizeof(int) + rows * sizeof(int*));
for (int i = 0; i < rows; i++) {
matrix[i] = matrix + rows * sizeof(int*) + rows * cols * sizeof(int) * i;
}
テストされていませんが、あなたはアイデアを理解しています。それ以外の場合は、Jasonの提案に固執します。