scanf
ожидает, что аргумент, соответствующий спецификатору преобразования %d
, будет адресом объекта int
(с типом int *
). Все, что значение a
содержит, будет интерпретироваться как адрес 1 .
Поведение при этом: undefined - компилятору не требуется выдавать диагностику c во время перевода, и среда выполнения не обязана выдавать какие-либо исключения , В зависимости от значения, содержащегося в a
, вы можете получить ошибку во время выполнения, или вы можете засорить другой объект данных, или ваш код может работать без каких-либо явных ошибок, или может произойти что-то совершенно иное.
По крайней мере, в системах, где sizeof (int) == sizeof (int *)
- для такой системы, как x86_64, это не так, поэтому scanf
будет обрабатывать байты за пределами из a
как часть адреса.