Статья Автор: Деникина Н.В., Деникин А.В.

Неинициализированные переменные

В отличие от некоторых языков программирования, C/C++ не инициализирует большинство переменных автоматически заданным значением (например, нулем). Когда переменной, которая не инициализирована, присваивается адрес памяти для хранения данных, значением переменной по умолчанию будет любое (мусорное) значение, которое уже находится в этом адресе памяти! Переменная, которой не было присвоено известное значение (через инициализацию или присваивание), называется неинициализированной переменной.

Использование значений неинициализированных переменных может привести к неожиданным результатам. Рассмотрим следующую короткую программу:



Скорей всего результат запуска программы будет 0, но этот результат неконтролируемый и в зависимости от выбранного компилятора будет "мусор", т.е. например вот такое число: 7177728.

В этом случае компьютер присвоит некоторую неиспользуемую память значению x. Затем он отправит значение, находящееся в этом месте памяти, в std::cout, который выведет это значение (интерпретированное как целое число). Но какое значение оно выведет? Ответ - "кто знает!", и ответ может меняться (а может и не меняться) каждый раз, когда вы запускаете программу. 

Большинство современных компиляторов попытаются определить, используется ли переменная без присвоения ей значения. Если они смогут это определить, они, как правило, выдадут предупреждение или ошибку времени компиляции. Например, компиляция указанной выше программы в Visual Studio выдаст следующее предупреждение:

c:\VCprojects\test\test.cpp(11) : warning C4700: uninitialized local variable 'x' used

Если ваш компилятор по этой причине не позволяет вам скомпилировать и запустить приведенную выше программу, вот возможное решение этой проблемы:



Использование неинициализированных переменных — одна из самых распространенных ошибок, которую допускают начинающие программисты, и, к сожалению, она также может быть одной из самых сложных для отладки (поскольку программа может работать нормально в любом случае, если неинициализированная переменная случайно была назначена участку памяти, в котором было разумное значение, например 0).

 

Это основная причина наилучшей практики «всегда инициализируйте переменные».

Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать