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