Короткий ответ? Это зависит от вашего компилятора - но не делайте этого.
Длинный ответ:
Доступ значение неинициализированный POD (простые старые данные, такие как int
) тип вызывает неопределенное поведение, что означает, что стандарт C не устанавливает каких-либо требований по соответствующей реализации в эта ситуация. Таким образом, компилятору разрешено испускать машинный код, который запускает nethack
, форматирует ваш жесткий диск или вообще ничего не делает, при этом все еще соответствует стандарту C, если он может доказать, что неопределенное поведение происходит в любом месте вашей программы.
(Также читайте: What Every C Programmer Should Know About Undefined Behavior)
Итак, что же на самом деле (вероятно) происходит?
В большинстве современных компиляторов без оптимизации включен, компилятор просто назначит слот в стеке (или регистр) для переменной, а затем получит доступ к тому, что было в этом месте до того, как его спросят. В результате получается «случайная память», хотя на самом деле it's not very random at all.
Что может случиться, если я включил оптимизацию?
Если вы затем перейдете на компиляцию кода на более высоком уровне оптимизации (или компилятор обновлен и теперь оптимизирован более агрессивно), все ставки отключены.Например, компилятор может удалить любые вызовы, которые включают x
, назначить x
тому же месту, что и некоторая другая переменная (утверждая, что x
не может быть использован, так как он еще не инициализирован) или any other combination of strange effects.
Другими словами, в тот момент, когда вы получаете доступ к этой неинициализированной переменной, ваша программа может начать делать что-нибудь вне вашего контроля. Не делай этого - вот драконы.
http://research.swtch.com/openssl –
Просто попробуйте, запустите несколько раз, когда ваша программа напечатает значение переменной: вы увидите, что она далека от использования в качестве случайного значения. – Antonio
Я сделал. И это дает мне такую же ценность каждый раз. Как работает функция освобождения памяти C? –