Как 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; //Зачем так  делать?
}

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

  1. В функции func выделяется память под указатель i на динамическом массиве размером в один int с помощью malloc.
  2. В коде не указано, но предположим, что в i сохраняется какое-то значение.
  3. Если условие в if-операторе не выполняется, то выполняется блок кода, который включает в себя:
    • Вызов функции free с аргументом i, что приводит к освобождению памяти, выделенной под i.
    • Присваивание i значения NULL, что можно интерпретировать как действие по очистке памяти.
  4. Если условие в if-операторе выполняется, то выполняется другой блок кода, который включает в себя:
    • Дальнейшие действия функции, которые не включают в себя вызов функции free или присвоение i значения NULL.
  5. В конце функции, независимо от выполнения условия в if-операторе, выполняется:
    • Вызов функции free с аргументом i, что приводит к освобождению памяти, выделенной под i.
    • Присваивание i значения NULL, что можно интерпретировать как действие по очистке памяти. Таким образом, код выполняет следующие действия:
  6. Выделяет память под указатель i на динамическом массиве размером в один int с помощью malloc.
  7. Если условие в if-операторе не выполняется, то:
    • Освобождает память, выделенную под i, с помощью free.
    • Присваивает i значение NULL.
  8. Если условие в if-операторе выполняется, то:
    • Продолжает выполнение функции без вызова free и присвоения i значения NULL.
  9. В конце функции, независимо от выполнения условия в if-операторе, выполняет:
    • Освобождает память, выделенную под i, с помощью free.
    • Присваивает i значение NULL.

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

8   голосов , оценка 4.25 из 5
Похожие ответы