#include <stdlib.h>
void free (void *ptr);
// ptr - Указатель на блок памяти для освобождения
// Не возвращает значения.
Функция free() принимает в качестве единственного параметра указатель на блок памяти выделенный одной из функций malloc(), realloc() или calloc() или NULL.
Функция free() не возвращает значения.
Функция free() не проверяет указатель ptr на правильность (не NULL) и не обнуляет адрес указателя после освобождения памяти, что может привести к «освобождению» невыделенной или уже освобожденной памяти, что в некоторых случаях может привести к необратимому повреждению кучи (heap). Вызов функции с NULL безопасен (проверка на NULL обязана выполняться внутри free() согласно стандарту). Для избежания повреждения кучи некоторые руководства по языку Си рекомендуют обнулять каждый освобождаемый указатель, после вызова функции free.
Пример программы с обнулением указателя после освобождения памяти функцией free(). Также следует обратить внимание что неинициализированный указатель указывает на случайную область памяти (не равен NULL).
#include <stdlib.h> // free(), malloc()
#include <stdio.h> // printf()
int main(){
int *ptr; // Определяем указатель (не инициализирован)
printf("%p \n", ptr); //> 0000000000000010 Выводим адрес неинициализированного указателя
ptr = malloc(10 * sizeof(*ptr)); // Выделяем память под 10 элементов типа *ptr
printf("%p \n", ptr); //> 00000000001F1460 Выводим адрес указателя на выделенную память
void free(void *ptr); // Освобождаем выделенную память
printf("%p \n", ptr); //> 00000000001F1460 Выводим адрес указателя на выделенную память. Хоть память и освободилась адрес указателя не изменился. И повторное free(ptr) может повредить находящиеся там "новые" данные.
ptr = NULL; // Обнуляем указатель
printf("%p \n", ptr); //> 0000000000000000 Теперь указатель безопасен для случайного повторного free(ptr)
}