Ryan Thomsen Ответов: 2

Почему этот код испытывает исключение в строке scanf


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

double input1 = 1.1;

int main()
{
    double celsius1, kelvin1, rankine1;
    scanf ("%g", input1);
    celsius1 = (input1 - 32) * (5 / 9);
    kelvin1 = (input1 + 459.67) * (5 / 9);
    rankine1 = (input1 + 459.67);
    printf("%g degrees Fahrenheit\n%g degrees Celsius\n%g degrees Kelvin\n%g degrees Rankine", input1, celsius1, kelvin1, rankine1);
    return 0;
}

Этот код говорит: "исключение, брошенное в 0x7AB06582 (ucrtbased.dll) в ConsoleApplication1.exe: 0xC0000005: нарушение доступа место записи 0x9999999A."когда я пытаюсь ввести ввод в строке scanf. Я должен использовать %g для задания, но не могу сказать, почему он не работает в этом коде.

Что я уже пробовал:

Я попытался добавить & перед переменными, похожими на некоторые примеры в интернете, однако стало появляться больше ошибок сборки.

2 Ответов

Рейтинг:
7

Jon McKee


В зависимости от строки формата функция может ожидать последовательность дополнительных аргументов, каждый из которых содержит указатель на выделенное хранилище, где интерпретация извлеченных символов хранится с соответствующим типом.
Таких аргументов должно быть по меньшей мере столько же, сколько значений, хранящихся в спецификаторах формата. Дополнительные аргументы игнорируются функцией.
Предполагается, что эти аргументы будут указателями: чтобы сохранить результат операции scanf для обычной переменной, ее имени должен предшествовать оператор ссылки (&)


Вам нужно только '&' перед input1 на scanf, потому что он принимает адреса памяти, а не значения, такие как printf. Добавление его в любом другом месте этого кода приведет к ошибкам.

Еще немного материала по указателям ниже. Это важная тема для понимания в C++.
Указатели - Учебники По C++ [^]
Указатели на C/C++ с примерами - GeeksforGeeks[^]

РЕДАКТИРОВАТЬ:
Причина, по которой вы получаете эту ошибку, заключается в том, что scanf пытается использовать значение input1 (1.1) в качестве адреса памяти (0x9999999A). Ваш код не владеет этой памятью, поэтому получает нарушение доступа.


CPallini

5.

Рейтинг:
18

Peter_in_2780

Тебе нужно писать

scanf ("%g", &input1);
для передачи адреса переменной в функции scanf. В другом месте вы ссылаетесь на значения, так что нет & нужен или желанен.


CPallini

5.