Если ввести строку заведомо большей длины, то она вся сохраняется. Я так понимаю, это потому, что длину массива никто не проверяет. Как избежать такого поведения? Никогда не задавать константной длину строки?
Собственно очень непростой вопрос. Начинать на него отвечать надо с постановки задачи. Что тебе угодно: избежать переполнения буфера, ограничив длину считываемой строк или считать потенциально бесконечно длинную строку?
Меня это настораживает. Разве scanf выделяет какую-то память? Он же просто пишет туда, куда ему скажут. А указатель будет указывать в небо, ты его ничем не инициализировал. А потом ты еще и делаешь free на память которую не выделял.