В Common Lisp существует несколько возможных подходов:
Пример:
> (sort '(1 (2 6 1) 4 (8 7 -3) 4 1 (0 (9 4)) -6 10 1)
(lambda (a b)
(atom a)))
(1 10 -6 1 4 4 1 (2 6 1) (8 7 -3) (0 (9 4)))
В качестве стабильной версии:
(stable-sort '(1 (2 6 1) 4 (8 7 -3) 4 1 (0 (9 4)) -6 10 1)
(lambda (a b)
(and (atom a)
(not (atom b)))))
(1 4 4 1 -6 10 1 (2 6 1) (8 7 -3) (0 (9 4)))
Ну, вы не дали нам полную реализацию. Полагаю, вы имели в виду.
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. Это потому, что теперь матрица будет храниться в памяти и вы извлечете выгоду из -локальности. В принципе, процессорный кэш будет намного счастливее с вами.
Как насчет просто:
int* mat = malloc(rows * columns * sizeof(int));
Другие ответы уже охватывали их, но для полноты, COMP.LANG.C FAQ имеет соответствующую запись:
Вы можете свернуть его на один вызов malloc, но если вы хотите использовать стиль массива 2d, вам все равно нужен цикл.
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;
}
Непроверенный, но вы поняли идею. Иначе я бы придерживался того, что предлагает Джейсон.
Для N-мерного массива вы можете сделать это:
int *matrix = malloc(D1 * D2 * .. * Dn * sizeof(int)); // Di = Size of dimension i
Для доступа к ячейке массива с типичным способом вы можете сделать это:
int index = 0;
int curmul = 1;
int i;
int indexes = {I1, I2, ..., In}; // Ii = Index in dimension i
for(i = N-1; i >= 0; i--) {
index = index + indexes(i) * curmul;
curmul = curmul * Di;
}
(Примечание: не тестировал сейчас, но должен работать. Переведен с моего кода MatLab, но в индексе MatLab начинается с 1, поэтому я могу допустить ошибку (но я так не думаю))
Вы также можете использовать Calloc, который дополнительно нулевой инициализирует для вас матрицу. Подпись немного отличается:
int *mat = (int *)calloc(rows * cols, sizeof(int));