Как free освобождает память, выделенную через malloc? - C (СИ)
Формулировка задачи:
Как функция free(void*) освобождает память выделенную malloc().
Если в malloc передавая размер malloc() знает сколько байт нужно выделить.
А в free() мы не передаем размер уничтожаемого блока, откуда free знает сколько байт нужно освободить?
Решение задачи: «Как free освобождает память, выделенную через malloc?»
textual
Листинг программы
void func(){ int* i = (int*)malloc(sizeof(int)); .... if(...) { free(i); //Ну раз это Си то он себя не почистит i = NULL; //Зачем так делать? return; } .... free(i); //Ну раз это Си то он себя не почистит i = NULL; //Зачем так делать? }
Объяснение кода листинга программы
- В функции
func
выделяется память под указательi
на динамическом массиве размером в одинint
с помощьюmalloc
. - В коде не указано, но предположим, что в
i
сохраняется какое-то значение. - Если условие в if-операторе не выполняется, то выполняется блок кода, который включает в себя:
- Вызов функции
free
с аргументомi
, что приводит к освобождению памяти, выделенной подi
. - Присваивание
i
значенияNULL
, что можно интерпретировать как действие по очистке памяти.
- Вызов функции
- Если условие в if-операторе выполняется, то выполняется другой блок кода, который включает в себя:
- Дальнейшие действия функции, которые не включают в себя вызов функции
free
или присвоениеi
значенияNULL
.
- Дальнейшие действия функции, которые не включают в себя вызов функции
- В конце функции, независимо от выполнения условия в if-операторе, выполняется:
- Вызов функции
free
с аргументомi
, что приводит к освобождению памяти, выделенной подi
. - Присваивание
i
значенияNULL
, что можно интерпретировать как действие по очистке памяти. Таким образом, код выполняет следующие действия:
- Вызов функции
- Выделяет память под указатель
i
на динамическом массиве размером в одинint
с помощьюmalloc
. - Если условие в if-операторе не выполняется, то:
- Освобождает память, выделенную под
i
, с помощьюfree
. - Присваивает
i
значениеNULL
.
- Освобождает память, выделенную под
- Если условие в if-операторе выполняется, то:
- Продолжает выполнение функции без вызова
free
и присвоенияi
значенияNULL
.
- Продолжает выполнение функции без вызова
- В конце функции, независимо от выполнения условия в if-операторе, выполняет:
- Освобождает память, выделенную под
i
, с помощьюfree
. - Присваивает
i
значениеNULL
.
- Освобождает память, выделенную под
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д