Нет, free()
освобождает память глобально, точно так же, как malloc()
выделяет память глобально. То есть память выделяется и, если указатель на нее сделан доступным (аргумент функции, возвращаемое значение функции, глобальная переменная), она остается выделенной и доступной неограниченное время - до тех пор, пока она не будет освобождена или программа не выйдет (или она не просочится; больше действительный доступный указатель на память). И выделенная память, которая освобождается, освобождается на неопределенный срок. Он может быть снова доступен другим распределением, но это случайно.
Если вы передаете указатель на выделенную память в функцию, и эта функция освобождает ее, она освобождается для вызывающего кода. Вызывающий код должен знать, что вызываемая функция освободила память, поэтому он не пытается использовать память после освобождения.