Необходимо ввести указатель на 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()
нужен указатель параметр для того, чтобы иметь возможность сохранять результат в нем.
Обратите внимание, что при прохождении массива например, char
массив scanf()
строку с "%s"
спецификатором, вы не должны использовать оператор &
, так как имя массива преобразуется в poitner первый элемент сам по себе, что что в этом случае нуждается scanf()
.
Обратите внимание, что нет проходят по ссылке в c, так что это единственный способ, вы можете изменить параметр внутри функции scanf()
.
Проблема заключается в зсапЕ, как указывалось другими, но я не уверен, о возврате либо. –
@ClaudioCortese 'return (0)' действителен, но не нужен, просто 'return 0' будет делать. –
@Weather Wane, не знал, что, LSNED;) –