Динамическое перераспределение - 2D массив - PullRequest
0 голосов
/ 15 февраля 2019
void matrixSetSize(double ***pMatrix, int size) {

    if (*pMatrix == NULL) { // void matrix
        *pMatrix = (double**)malloc(size * sizeof(double*));
        for (int i = 0; i < size; i++)
            *(*pMatrix + i) = (double*)malloc(size * sizeof(double));
    }
    else { // resize existing matrix
        double **pointer = (double**)realloc(*pMatrix, 2 * size * sizeof(double*));
        for(int i = 0; i < size; i++)
            pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double));

        for (int i = size; i < 2 * size; i++)
            pointer[i] = (double*)malloc(size * sizeof(double));

        for(int i = 0; i < size; i++)
            free(*(*pMatrix + i));
        free(*pMatrix);

        *pMatrix = pointer;
    }

}

Проблема: Когда я пытаюсь определить размер матрицы, код не работает, и я не знаю почему.Может кто-нибудь объяснить мне, почему не работает?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Это не отвечает на проблему вашего размещенного кода, но, возможно, может помочь вам в увеличении картинки:

double (*matrix)[size] = malloc(initial_size * initial_size * sizeof(double));
matrix[0][0] = 42;
matrix[size-1][size-1] = 24;

/* resizing */
double (*new_mat)[new_size] = realloc(matrix, new_size*new_size*sizeof(double));
matrix[0][0] = 42;
matrix[new_size-1][new_size-1] = 24;

/* freeing */
free(new_mat);

Разве это не намного проще?И это намного, намного быстрее, чтобы выделить / бесплатно, так как это только одно распределение.И это намного, намного быстрее в использовании, так как:

  • это один непрерывный блок памяти, так что он кеш-памяти
  • вы получаете прямой доступ к ячейке, у вас нет данныхзависимость от промежуточного указателя.

Пожалуйста, когда вам нужен 2D-массив, создайте 2D-массив, а не 1D-массив для указателей-N-1D-массивов.

два предупреждения: 1) если вы хотите сохранить старые данные при изменении размера, вам необходимо переместить их вручную и 2) ваш компилятор должен поддерживать C99.

0 голосов
/ 15 февраля 2019

Две проблемы:

  1. Рассмотрим эти строки из кода перераспределения:

    pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double));
    pointer[i] = (double*)malloc(size * sizeof(double));
    

    Во втором вы не выделяете столько памяти, сколько перераспределение.

  2. После перераспределения вы освобождаете старые данные, но это уже было сделано с помощью вызовов realloc.

Нанесвязанное примечание, в C вы не должны разыгрывать результат malloc (или его братьев и сестер) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...