Ваш вопрос говорит о том, что вы думаете, gets
может как-то знать, что word
имеет длину всего 6 символов, поэтому он заполняет его всего 6 символами и оставляет остаток в буфере, связанном с входным потоком. Это не относится к делу. Вызов gets(word)
передает только начальный адрес от word
до gets
. Это все, что он получает - стартовое место. Он не получает никакой информации о длине. gets
читает из входного потока до тех пор, пока не будет прочитан символ новой строки или не будет обнаружен конец файла или произойдет ошибка.
Если вы ввели «HELLO WORLD» и программа напечатала это, это потому, что gets
прочитал данные и записал их в память, превысив границы word
. Не происходит какой-либо необычной буферизации или взаимодействия - просто записывается поверх памяти, которая не была назначена для этой цели. Это могло что-то сломать в вашей программе. Но, похоже, вам повезло, что ошибка не сразу сломала вашу программу, и данные находились там до тех пор, пока puts
не смог прочитать ее из памяти и записать на выход.
Однако вам никогда не следует ожидать такого поведения. Одна из причин, которая работала так, как она работала, это то, что у вас есть очень простая программа, которая больше ничего не делала с памятью. В более сложных программах, где есть много объектов и действий, более вероятно, что переполнение буфера нарушит работу программы различными способами.