Корректное освобождение памяти - C (СИ)
Формулировка задачи:
Создаю двумерный массив таким способом: выделяю линейный массив, затем "делю" его на части.
Вопрос, если вместо free(pTmp) освободить память через free(pM[0]) корректно ли она освободится, ведь pM[0] указывает на ту же ячейку, что и pTmp? или я что-то путаю?
#include <stdio.h> #include <malloc.h> int main(){ int ** pM; int * pTmp; int x=6,y=8; pTmp=(int*)malloc(x*y*sizeof(int)); pM=(int**)malloc(x*sizeof(pM)); for(int i=0;i<x;i++) *(pM+i)=(pTmp+y*i); for(int i=0;i<x;i++) for(int j=0;j<y;j++) pM[i][j]=i*y+j; pM[1][2]=45; for(int i=0;i<x;i++){ for(int j=0;j<y;j++) printf("%2d ",pM[i][j]); printf("\n"); } free(pM); free(pTmp); return 0; }
Решение задачи: «Корректное освобождение памяти»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> /*...*/ int rows, columns, **matrix, i, j; /* получить или задать значения rows и columns */ if ( ( matrix = malloc(sizeof(int*) * rows) ) == NULL ) { perror("malloc"); exit(1); } for ( i = 0; i < rows; ++i ) { if ( ( matrix[i] = malloc(sizeof(int) * columns) ) == NULL ) { perror("malloc"); exit(1); } } for ( i = 0; i < rows; ++i ) { for ( j = 0; j < columns; ++j ) { /* работа с элементами матрицы */ } } for ( i = 0; i < rows; ++i ) free(matrix[i]); free(matrix); /*...*/
Объяснение кода листинга программы
- Название переменной: rows, columns, matrix, i, j
- Тип данных: int, int*, int**, int, int
- Значение: rows, columns, matrix, i, j - переменные, которые используются в коде
- Описание:
- Код предназначен для работы с двумерным массивом (матрицей)
- Переменная
rows
содержит количество строк в матрице - Переменная
columns
содержит количество столбцов в матрице - Переменная
matrix
является указателем на первый элемент матрицы - Переменные
i
иj
используются в цикле для обращения к элементам матрицы
- Управление памятью:
- С помощью функции
malloc
выделяется память под массив указателей на int (для хранения строк матрицы) - Для каждой строки матрицы с помощью функции
malloc
выделяется память под массив int (для хранения столбцов матрицы) - После использования матрицы, память освобождается с помощью функции
free
- С помощью функции
- Цель: корректное освобождение памяти
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д