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