Вы можете освободить только то, что вы выделили. Вы выделили весь буфер, а не отдельные элементы буфера.
из N1256 (у меня нет с собой стандарта C99)
$ 7.20.3.2 / 2- "Свободная функция заставляет освободить пространство, на которое указывает ptr, то есть сделать доступным для дальнейшего выделения. Если ptr является нулевым указателем, никаких действий не происходит. В противном случае, если аргумент не соответствует указателю, ранее возвращенному функцией realloc из calloc, malloc или 261), или если пространство было освобождено при вызове free или realloc, поведение не определено.
Однако, если вы хотите удалить ненужные элементы, считанные из буфера, вам придется либо сделать это самостоятельно, если вы используете массивы, либо вам придется согласиться на контейнеры STL (вектор / список) и т. Д. (Которые предоставляют интерфейсы для управления элементами)