Во-первых, fflush
из stdin
вызывает неопределенное поведение (спасибо Полу Р. за разъяснение).
Во-вторых, вы правы, использование gets
с переменной с начальным значением неверно. Во-первых, потому что память, указанная этой переменной, может быть только для чтения (раздел DATA вашей программы, который обычно содержит данные только для чтения); во-вторых, gets
может находиться за пределами конца строки, вызывая повреждение памяти (например, перезаписывая другие данные, хранящиеся в разделе DATA, следующем за этой строкой). Наконец, использование gets
устарело именно по этой причине: вы не можете ограничить степень чтения строки.