Эта программа демонстрирует неопределенное поведение : тип &c
(char *) не соответствует типу аргумента scanf (%d
хочет подписать int *).
Вероятно, происходит то, что scanf записывает 4 байта в ячейку памяти, начиная с адреса c
. Длина которого составляет всего 1 байт, поэтому остальные 3 байта перезаписывают первые 3 байта значения i
. В системе с прямым порядком байтов это фактически установит i
в любое целочисленное значение, которое вы вводите, смещенное вправо на 8 бит.
Но, конечно, поведение не определено. В следующий раз, когда вы скомпилируете этот код, он может сделать что-то совершенно другое. Другой компилятор или тот же компилятор с другими параметрами может хранить i
в регистре (где scanf не может его перезаписать) (но вместо этого он может разбить адрес возврата в стеке, вызывая сбой при завершении программы), или он может поместить значения в стек в обратном порядке (то же самое), или он может оставить 4 байта в стеке для c
(не вызывая неожиданного поведения), или он может обнаружить ситуацию и прервать работу с ошибкой, или это может даже заставить демонов вылететь из вашего носа .