Корректное освобождение памяти - 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
- С помощью функции
- Цель: корректное освобождение памяти