Как освободить память 2D-массива в C - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь выделить память для 2D-массива.Но когда я пытаюсь освободить память, возникает ошибка сегментации.Пожалуйста, помогите мне узнать, что я делаю не так?

  int **arr1 = (int **) malloc (rows * columns * sizeof (int));

  //Array Access:
  for (i = 0; i < rows; i++)
    for (j = 0; j < columns; j++)
      *(arr1 + i * columns + j) = ++count;

  for (i = 0; i < rows; i++)
    for (j = 0; j < columns; j++)
      printf ("%d", *(arr1 + i * columns + j));

  for (i = 0; i < rows*columns; i++)
    free (arr1[i]);

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Простое правило для каждого malloc должно быть free.Вы выделили блок памяти, на который указывает arr1, поэтому вам следует освободить этот один блок памяти.

free(arr1);

Вы не можете освободить блок памяти по частям,Если вы хотите сделать это, вам нужно выделить каждую строку индивидуально, но использование одного куска памяти в качестве 2D-массива также подойдет.Выделение каждой строки лучше, если размер каждой строки неизвестен.Одно большое распределение лучше, если размер строки фиксирован.


Кроме того, arr1 должен быть одним указателем, а не двойным указателем.Предупреждения компилятора должны были предупредить вас об этом.

int *arr1 = malloc (rows * columns * sizeof(int));

A двойной указатель - указатель на указатель.Нет необходимости создавать двойной указатель, чтобы сделать вид, что указатель является 2D-матрицей.

0 голосов
/ 25 ноября 2018

Вы можете циклически проходить по каждой строке и на каждой итерации вы можете выделять пространство на этапе создания и освобождать его на этапе очистки самостоятельно.У вашего кода есть несколько проблем, я думаю, что это может быть лучшим подходом для записи в такой форме:

int **array = (int**) malloc( row * sizeof(int*)), i = 0, j;

for( ; i < row; i++){
    *(array + i)  = (int*) malloc(col * sizeof(int));
    for( j = 0; j < col; j++){
        *(*(array + i) + j) = i * row + j;
    }
}

Это создаст 2d массив со значениями в порядке возрастания.

Хотяосвобождение:

for(i = 0 ; i < row; i++){
    free(*(array + i));
}
free(array);
0 голосов
/ 25 ноября 2018

Похоже, вы пытаетесь выделить массив указателей для массивов.Ваш код не работает, потому что вы free нераспределенная память.Правильный способ выделения «2D-массива» больше похож на этот:

int **arr1 = malloc (rows * sizeof (int*));

for (int r = 0; r < rows; r++)
  arr1[r] = malloc(columns * sizeof(int));

...

for (int r = 0; r < rows; r++)
  free(arr1[r]);

free(arr1);
...