Я использую malloc для выделения памяти для матрицы, но впоследствии любой доступ к матрице для установки элемента, например, приводит к ошибке сегментации.
Вот что я делаю прямо сейчас:
int **matrix = malloc(rows_number * columns_number * sizeof(int));
if (matrix) matrix[0][0] = 1;
Почему я не могу получить доступ к матрице после ее создания? Вызов malloc выполнен успешно, поэтому у меня достаточно непрерывной памяти для всей матрицы.
Ответ 1 · рейтинг 2 · DigitalRoss
Проблема здесь в том, что вы выделили только память, но объявили свой объект как набор указателей на указатели. Для двойного нижнего индекса требуется вектор-указатель, указывающий на каждую строку или тип, сообщающий компилятору, сколько имеется столбцов.
Итак, некоторые варианты:
- выполнить расчет нижнего индекса с помощью кода, возможно, с помощью макроса
- сделать два
mallocs() и инициализировать вектор указателя строки
- malloc объект определенного типа, чтобы компилятор мог его увидеть
Например...
int (*matrix)[ROWS][COLS] = malloc(ROWS * COLS * sizeof(int));
...
(*matrix)[i][j]
Следующее объявление также будет работать:
int (*matrix)[][COLS] = malloc(ROWS * COLS * sizeof(int));
Ответ 2 · рейтинг 2 · Eric Postpischil
int **matrix объявляет matrix указателем на указатель на int. Вам нужен указатель на массив int. Это будет int (*matrix)[columns_number]. Вы можете красиво распределить его с помощью:
int (*matrix)[columns_number] = malloc(rows_number * sizeof *matrix);
Ответ 3 · рейтинг 1 · K-ballo
Вы выделили память для динамического массива целых указателей, а не для элементов int. Вы можете попробовать что-то вроде этого:
int *matrix_storage = malloc(rows_number * columns_number * sizeof(int));
int **matrix = malloc(rows_number * sizeof(int*));
for( int i = 0; i < rows_number; ++i )
matrix[i] = &matrix_storage[ i * columns_number ];
Ответ 4 · рейтинг 1 · Foggzie
Malloc возвращает пустой указатель, поэтому вы не создали двумерный массив. Попробуйте что-то вроде:
int **matrix;
matrix = malloc(rows_number * sizeof(int*));
for (int i=0; i<rows_number; i++)
matrix[i] = (int*)malloc(columns_number * sizeof(int));