Вы должны передать указатель на int
вместо самого int
. Измените его на
if (scanf("%d", &a) == 1)
printf("%d\n", a);
else
printf("Invalid input\n");
В вашем коде scanf()
предполагает, что значение в int
является адресом, по которому он должен писать, что приводит к неопределенному поведению. Кроме того, еще одна причина неопределенного поведения заключается в том, что a
не нужно инициализировать перед вызовом scanf()
, но это не имеет значения, так как в любом случае неопределенное поведение должно было произойти. Стандарт указывает, что любой параметр неожиданного типа, переданный в scanf()
, вызовет неопределенное поведение.
Тот факт, что a
не был инициализирован перед вызовом scanf()
, означает, что если вы проигнорируете возвращаемое значение scanf()
и оно завершится ошибкой, и вы попытаетесь прочитать a
, как в printf()
в вашем коде, ваш код вызовет неопределенное поведение. Вот почему так важно проверять возвращаемое значение.
Оператор &
адреса создает указатель, содержащий адрес его операнда, scanf()
нужен указатель на параметр1, чтобы можно было сохранить в нем результат.
Обратите внимание, что при передаче массива, например, массива char
в scanf()
строку со спецификатором "%s"
, вы не должны использовать оператор &
, потому что имя массива преобразуется в указатель на первый элемент самого себя, что и требуется scanf()
в тот случай.
1Обратите внимание, что в c, так что это единственный способ изменить параметр внутри функции scanf()
.
21.01.2016
scanf()
, вы также поймете, почему я сравниваю его возвращаемое значение в1
. И всегда делайте это, игнорирование возвращаемого значения может привести к очень странным ошибкам. 21.01.2016scanf
как адрес памяти (как если бы это был действительный указатель), так что результат записывается в память с адресом, который == ЗНАЧЕНИЕa
вместо на память, которой владеетa
. 21.01.2016