Корректное освобождение памяти - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Создаю двумерный массив таким способом: выделяю линейный массив, затем "делю" его на части.
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. int main(){
  4. int ** pM;
  5. int * pTmp;
  6. int x=6,y=8;
  7. pTmp=(int*)malloc(x*y*sizeof(int));
  8. pM=(int**)malloc(x*sizeof(pM));
  9. for(int i=0;i<x;i++)
  10. *(pM+i)=(pTmp+y*i);
  11. for(int i=0;i<x;i++)
  12. for(int j=0;j<y;j++)
  13. pM[i][j]=i*y+j;
  14. pM[1][2]=45;
  15. for(int i=0;i<x;i++){
  16. for(int j=0;j<y;j++)
  17. printf("%2d ",pM[i][j]);
  18. printf("\n");
  19. }
  20. free(pM);
  21. free(pTmp);
  22. return 0;
  23. }
Вопрос, если вместо free(pTmp) освободить память через free(pM[0]) корректно ли она освободится, ведь pM[0] указывает на ту же ячейку, что и pTmp? или я что-то путаю?

Решение задачи: «Корректное освобождение памяти»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*...*/
  4. int rows, columns, **matrix, i, j;
  5.  
  6. /* получить или задать значения rows и columns */
  7.  
  8. if ( ( matrix = malloc(sizeof(int*) * rows) ) == NULL ) {
  9.     perror("malloc");
  10.     exit(1);
  11. }
  12. for ( i = 0; i < rows; ++i ) {
  13.     if ( ( matrix[i] = malloc(sizeof(int) * columns) ) == NULL ) {
  14.         perror("malloc");
  15.         exit(1);
  16.     }
  17. }
  18.  
  19. for ( i = 0; i < rows; ++i ) {
  20.     for ( j = 0; j < columns; ++j ) {
  21.         /* работа с элементами матрицы */
  22.     }
  23. }
  24.  
  25. for ( i = 0; i < rows; ++i )
  26.     free(matrix[i]);
  27. free(matrix);
  28. /*...*/

Объяснение кода листинга программы

  1. Название переменной: rows, columns, matrix, i, j
  2. Тип данных: int, int*, int**, int, int
  3. Значение: rows, columns, matrix, i, j - переменные, которые используются в коде
  4. Описание:
    • Код предназначен для работы с двумерным массивом (матрицей)
    • Переменная rows содержит количество строк в матрице
    • Переменная columns содержит количество столбцов в матрице
    • Переменная matrix является указателем на первый элемент матрицы
    • Переменные i и j используются в цикле для обращения к элементам матрицы
  5. Управление памятью:
    • С помощью функции malloc выделяется память под массив указателей на int (для хранения строк матрицы)
    • Для каждой строки матрицы с помощью функции malloc выделяется память под массив int (для хранения столбцов матрицы)
    • После использования матрицы, память освобождается с помощью функции free
  6. Цель: корректное освобождение памяти

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы