В C. нет такой вещи, как "struct has data" или "struct not data". В вашей программе есть указатель, который указывает где-то в памяти. Пока эта память принадлежит вашему приложению (то есть не возвращается в систему), она всегда будет содержать что-то. Это «что-то» может быть полным мусором или выглядеть более или менее значимым. Кроме того, память может содержать мусор, который выглядит как нечто значимое (остатки ранее сохраненных данных).
Это именно то, что вы наблюдаете в своем эксперименте. Как только вы освободили структуру, ранее занимаемая ею память официально содержала мусор. Однако этот мусор все еще может напоминать фрагменты исходных данных, хранящихся в этом объекте структуры в момент его освобождения. В вашем случае вам повезло, поэтому данные выглядят нетронутыми. Но не рассчитывайте на это - в следующий раз он может быть полностью уничтожен.
Что касается языка Си, то, что вы делаете, представляет собой неопределенное поведение. Вы не можете проверить, имеет ли освобожденная структура «данные» или нет. Вопрос «почему», который вы задаете, на самом деле не существует в области языка C.