Как скажет справочная страница для free
, любой аргумент, кроме указателя, возвращенного из malloc
, имеет неопределенное поведение:
Функция free () освобождает пространство памяти, на которое указываетptr, который должен был быть возвращен предыдущим вызовом malloc (), calloc () или realloc ().В противном случае или, если free (ptr) уже был вызван ранее, происходит неопределенное поведение.Если ptr равен NULL, никакие операции не выполняются
Относительно того, как free
знает размер блока: типичная реализация распределителя памяти имеет заголовок для каждого блока (содержащий размер, указатели freelist и т. Д.) и free
знает размер этого заголовка и смещение от указателя, возвращаемое malloc
.
Это также отвечает на ваш первый вопрос: malloc
выделяет такой блок и возвращает указатель на началофактического объекта.