Когда вы передаете test
к scanf()
, вы не передаете ничего, кроме указателя на первый символ вашего буфера, так scanf()
не знает, насколько велик ваш буфер. Он с радостью примет столько символов, сколько вы наберете, и он сохранит их там. Таким образом, когда вы вводите более двух символов, вы вызываете scanf()
для записи символов (плюс нулевой символ символа asciiz) за конец вашего буфера. Как правило, в этом случае следует ожидать краха программы.
Тот факт, что вы не испытали сбой, в основном совпадение, вероятно, происходит потому, что компилятор выделил место для более чем трех символов в стеке из-за соображений выравнивания, возможно, для 8 символов и более. Если вы наберете достаточное количество символов, ваша программа наверняка сбой.
По этой причине это использование scanf()
считается полностью опасным. Никогда не следует использовать scanf()
, когда делаете серьезное кодирование. Вместо этого вы должны указать ширину своей строки, например: "%2s"
. (Обратите внимание, что вы должны указать число, которое меньше размера вашего буфера на единицу, для учета нулевого символа терминатора asciiz, который будет автоматически добавлен scanf()
.)
Это * неопределенное поведение *. Это означает, что все может произойти, включая, по-видимому, правильную работу. Я не привязывал шнурки к обуви. Почему я не упал? Это вопрос. –
Вы не сказали 'scanf()', сколько места было доступно для данных, поэтому предполагается, что для всего, что было введено, должно быть достаточно свободного места. Поэтому он делает все возможное, чтобы сохранить 8 символов, но это переполняет указанный вами массив, что приводит к неопределенному поведению. Если вы учитесь на современном языке с автоматической защитой от переполнения буфера, обучение C будет грубым. Среда C не защищает вас от вашего недоразумения или небрежного поведения. (И 'char test [3]' может содержать только двухсимвольную строку плюс нулевой ограничитель.) –
Любопытно, почему вы _expect_ C не принимали больше символов, чем в буфере есть место? – chux