Что произойдет, если я передам значение переменной вместо ссылки на переменную в scanf? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть этот код:

int a;

scanf("%d", &a);

printf("You entered: %d", a);

, который прекрасно работает, но мне было интересно, что произойдет, если я передам значение переменной вместо ссылки на переменную в scanf, как scanf("%d", a).

Я не получаю сообщение об ошибке от компилятора, но нет и выходных данных. Что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

В основном & является оператором, который возвращает адрес операнда. Если вы передадите в scanf переменную a без &, она будет передана ей по значению, что означает, что scanf не сможет установить ее значение, чтобы вы ее увидели. Передача по ссылке - использование & фактически передает указатель на a - позволяет scanf установить его.

0 голосов
/ 16 апреля 2020

scanf ожидает, что аргумент, соответствующий спецификатору преобразования %d, будет адресом объекта int (с типом int *). Все, что значение a содержит, будет интерпретироваться как адрес 1 .

Поведение при этом: undefined - компилятору не требуется выдавать диагностику c во время перевода, и среда выполнения не обязана выдавать какие-либо исключения , В зависимости от значения, содержащегося в a, вы можете получить ошибку во время выполнения, или вы можете засорить другой объект данных, или ваш код может работать без каких-либо явных ошибок, или может произойти что-то совершенно иное.


По крайней мере, в системах, где sizeof (int) == sizeof (int *) - для такой системы, как x86_64, это не так, поэтому scanf будет обрабатывать байты за пределами из a как часть адреса.
0 голосов
/ 16 апреля 2020

В scanf "%d" ожидает указатель на int, означающий указатель на адрес переменной, в которой будет храниться значение, если вы передадите a, вы просто передадите int, пути нет значение может быть сохранено, потому что scanf не будет знать, где.

Это вызовет неопределенное поведение .

...