Я хочу выделить матрицу.
это единственный вариант:
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 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)
для упорядочения по столбцам.
Один из этих двух вариантов на самом деле является предпочтительным способом обработки матрицы в C. Это связано с тем, что теперь матрица будет храниться в памяти непрерывно, и вы получите преимущества от локальность ссылки. По сути, кеш процессора будет намного счастливее с вами.
Другие ответы уже касались этого, но для полноты в часто задаваемых вопросах comp.lang.c есть соответствующая запись:
Как я могу динамически выделить многомерный массив?
что вы можете сделать, это
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));
Вы можете свернуть его до одного вызова malloc, но если вы хотите использовать стиль двумерного массива, вам все равно нужен цикл 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;
}
Не проверено, но вы поняли идею. В противном случае я бы придерживался того, что предлагает Джейсон.
sizeof (int) == sizeof (int *)
- иначе смещение будет неправильным; на самом деле это может быть неправильно, даже если это так 24.01.2010
cols
является константой времени компиляции, вам даже не нужно самостоятельно вычислять смещения; если вы используетеint (*mat)[cols] = malloc(rows * sizeof *mat)
, вы можете получить доступ к элементам черезmat[i][j]
и по-прежнему использовать непрерывный блок памяти 24.01.2010