получает (и) читает строку из стандартного ввода в
буфер указывает на s до
либо завершающий перевод строки, либо EOF,
который он заменяет на '\ 0'. Нет проверки
для переполнения буфера выполняется
http://linux.die.net/man/3/gets
Когда вы выполняете get, ввод записывается в буфер, на который указывает s. Затем он добавляет \ 0. Только 't' находится внутри входного буфера. Остальное расположено на непрерывной памяти в стеке.
printf печатает «test», потому что он может читать, начиная с s до первого \ 0. Но «est \ 0» находятся вне буфера.
------
| t | input - Debugger only sees this position.
------
| e | Memory you are stepping onto. Trouble if it doesn´t belong to your proc.
| s |
| t |
| \0 |
------
Когда вы отлаживаете, input указывает только на один символ, так что это все, что вы можете увидеть.
Важно взглянуть на "Проверка переполнения буфера не выполняется" . Это означает, что функция get не заботится о том, выделена ли память для ввода. Он просто начнет копировать все это с той точки, которую вы указали. Если вы не будете осторожны, ваш вклад может повлиять на важную информацию. В некоторых наихудших случаях это будет адрес возврата для вашей функции (где вы используете get). Кто-то, кто «просто делает» эту ошибку, скажет, «что происходит». Кто-то, кто намеренно делает это, направит ваш адрес возврата на определенную часть и выполнит код, расположенный там.
Подробнее о переполнении буфера.