выделить матрицу в C

Я хочу выделить матрицу.

это единственный вариант:

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. Это связано с тем, что теперь matrix будет храниться смежно в памяти, и вы получите выгоду от локальности ссылки . По сути, кэш CPU будет намного счастливее с вами.

Другие ответы уже рассмотрели эти вопросы, но для полноты информации в файле comp.lang.c есть соответствующая запись:

Как я могу динамически распределять multidimensional array?

что вы можете сделать, это

 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, но если вы хотите использовать стиль массива 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; } 

Непроверенный, но вы понимаете. В противном случае я придерживаюсь того, что предлагает Джейсон.

Для 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, поэтому я МОЖЕТ ошибиться (но я так не думаю)

Повеселись!

  • Crash или «segmentation fault», когда данные копируются / отсканированы / прочитаны неинициализированному указателю
  • Каковы операторы Pointer-to-Member -> * и. * В C ++?
  • как отображать изображения, сохраненные в папке sdcard в android
  • В чем разница между C # Reference и указателем?
  • Оператор Dot (".") И стрелка ("->") используют в C против Objective-C
  • значение «ссылки» и «разыменование»,
  • Неинициализированные указатели в коде
  • Не удается найти модуль 'angleular2 / angular2'
  • Почему в C ++ не существует ссылки на член?
  • Как избежать утечек памяти при использовании вектора указателей на динамически выделенные объекты в C ++?
  • Давайте будем гением компьютера.