Почему обязательна инициализация локальных переменных

Насколько я знаю локальные переменные по умолчанию инициализируются каким-либо мусором со стека, например тем что лежало по этому адресу ранее, так ли это? Следующий вопрос заключается вот в чем, если они все таки инициализируются какими-либо значениями, то почему компилятор msvc++ выбивает ошибку, про использование неинициализированной памяти. Почему так, если компилятор при компиляции должен только расставлять смещения и на значения переменных по идее не должен обращать внимание.


Ответы (1 шт):

Автор решения: KoVadim

Насколько я знаю локальные переменные по умолчанию инициализируются каким-либо мусором со стека, например тем что лежало по этому адресу ранее, так ли это?

нет, они не "инициализируются мусором", просто так складывается, что там оказывается такое значение.

Следующий вопрос заключается вот в чем, если они все таки инициализируются какими-либо значениями, то почему компилятор msvc++ выбивает ошибку, про использование неинициализированной памяти.

нет, не инициализируется и Ваша программа стает "неопределенной". То есть, ее поведение зависит от факторов, которые не известны программе. Если Ваша программа считает что то (а что ей ещё делать?) и она основывается на не инициализированных переменных, то ее результат может быть в принципе любой. А значит компилятор (в теории) может выбрать один с возможных вариантов и завершить на том.

Представьте, что Вы считаете сумму ряда, но вот переменную для суммирования Вы не инициализировали. Так как ее значение в теории может быть любое с возможных, то добавляя любое число, ответ все равно может быть любой. А значит компилятор может просто вывести 0 или 100 и он будет абсолютно прав. Именно поэтому компилятор и ругается.

Почему так, если компилятор при компиляции должен только расставлять смещения и на значения переменных по идее не должен обращать внимание.

компилятор может ещё делать чудо оптимизации. Например, clang умеет считать в на этапе компиляции суммы ряда и сокращать до известной школьной формулы.

И как тут не вспомнить мою любимую шутку, которую найдете в другом моем ответе Зачем нужно обнуление переменных?

→ Ссылка