Я действительно не понимаю, в чем ваша проблема.
Это полностью зависит от библиотеки, в которой она распределяет память, которая возвращается вам. В частности, он может использовать или не использовать последний освобожденный блок памяти, если он еще свободен.
Ваш первый malloc()
резервирует некоторую память, вы записываете в нее, а затем освобождаете ее.
Ваш второй malloc()
резервирует некоторую память, вы читаете из нее, а затем освобождаете ее.
То, что вы читаете на втором шаге, совершенно произвольно и только по совпадению совпадает с тем, что вы написали ему впервый шаг.
Ваш код также показывает неопределенное поведение, потому что вам не разрешен доступ к ip[5]
после free(it)
.