Что касается заголовка «Что входит в локальные переменные по умолчанию?»
Ничего. Согласно C 2018 6.7.9 10, «Если объект, имеющий автоматическую продолжительность хранения, не инициализирован явно, его значение является неопределенным». (То, что вы называете «локальной переменной», - это объект с автоматической продолжительностью хранения.) Согласно 3.19 .2 неопределенное значение является либо неопределенным значением, либо представлением ловушки. Согласно 3.19.3, стандарт С не предъявляет требований к выбору значения в любом случае .
Рассмотрим:
int x;
printf("%d", x);
printf("%d", x);
В этих двух случаях printf
может печатать разные числа. Значение x
не указано в любом случае. Программа не работает.
Кроме того, в 6.3.2.1 2 существует правило, которое сводится к следующему: если вы используете неинициализированную локальную переменную, а ее адрес никогда не принимается, поведение программы не определяется стандартом Си. Это означает, что переменная может не только иметь разные значения в разное время, но и то, что стандарт C вообще не определяет поведение программы. Оператор printf
не обязательно будет напечатан. Программа может аварийно завершить работу. Программа может вызывать совершенно разные процедуры от того, что вы ожидаете. Стандарт C не предъявляет никаких требований.
Решение: Инициализируйте свои локальные переменные, написав = SomeInitialValue
при их объявлении, как в int x = 0;
, или присвоив им значения перед их использованием.
1. В вопросе сказано, что должны использоваться только локальные переменные.
Решение: Использовать только локальные переменные. Удалите глобальные переменные из вашей программы. Если подпрограмме требуются данные от вызывающей стороны, передайте ее с параметром.
2. Функция чтения должна была читать… Строки 14 и 15…
Строки 14 и 15 в коде вашего вопроса не соответствуют строкам, которые должны быть в функции чтения. Вы, кажется, поместили в вопрос код, который отличается от того, на что ссылался преподаватель.
Решение: Поставьте точно код, который преподаватель рассмотрел в вопросе. Следуйте инструкциям репетитора.
3. Потому что вы использовали текст в качестве глобальной переменной ...
См. 1. и 2. выше. Как и в 2., код не соответствует этому комментарию; Вы, кажется, показали код, отличный от того, что рассматривал репетитор. Покажите точный код в вопросе и не используйте глобальные переменные.