В качестве расширения ответа Штефана Лехнера рассмотрим, что происходит при выполнении scanf_s("%c %d",&ch,&x)
.
Технически, это неопределенное поведение, потому что вы не указали правильные параметры для scanf_s
.
Однако на практике код будет пытаться интерпретировать ненужные значения в памяти как отсутствующие параметры.То есть код эквивалентен примерно так:
scanf_s("%c %d", &ch, 0xf0000000, 0xdeadbeef);
Здесь 0xf0000000
представляет адрес переменной x
.Код scanf_s
будет интерпретировать его как размер буфера (очень большой буфер), но это не имеет никакого эффекта, потому что %c
говорит ему прочитать только один байт.Кроме того, 0xdeadbeef
представляет собой мусор, и код интерпретирует его как адрес для записи вашего целочисленного результата.Запись по случайным адресам - это большое «нет-нет», поэтому происходит сбой.
Когда ваш код читает отдельно char
и int
, он никогда не сталкивается с записью по случайному адресу, поэтому все работает хорошо,и если вы игнорируете предупреждения компилятора, вы никогда не узнаете, что ваш код содержит ошибки.