Проблема неинициализированной переменной
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Товарищи! Столкнулся с таким феноменом: обычно если объявленную, но неинициализированную переменную попытаться подставить в арифметическое выражение — программа «ругается» и выдает сообщение об ошибке.
Но! Если после объявления переменной (опять же без ее инициализации!!!) просто вывести на экран ее адрес:
(причем даже если это сделать так:
printf("&a=%i", &a);
)можно дальше пользоваться этой переменной уже как инициализированной — в качестве ее значения будет «мусор», который располагался в выделенном под нее адресе.
Тот же эффект достигается, если после неинициализированной переменной объявить указатель и связать его с адресом этой переменной:
ПОЧЕМУ ??? Как это «подменяет» настоящую инициализацию???
Константин, и тебе привет от отладочной версии CRT (C++ Run-Time system — исполняющая система языка С++). Это она «ругается» на неинциализированную переменную. Если перекомпилируешь программу в конфигурации Release, то никаких лишних сообщений не будет, а содержимым неинициализированной переменной будет мусор.
Если выбросится необработанное исключение, то программа завершит работу. И винда предложит отправить отчет об ошибке.
Ему уже подробно ответили на другом форуме.
Не будет там необработанного исключения. Переменная определена, память для неё выделена. С чего бы исключению подняться?
Если runtime-библиотека «ругается» в режиме отладки, значит выбрасывается исключение.
По какой причине оно выбрасывается — это уже другой вопрос.
Это может быть косвенно связано с неинициализированной переменной. Нужно смотреть стек вызовов.
Runtime-библиотека «ругается» в режиме отладки на неинициализированную переменную потому, что она заточена на это (ну и не только на это, конечно). Мало того, Debug-CRT ещё и инициализирует эту «неинициализированную» переменную магическим числом 0xffffffffcccccccc. А ещё она в нашем случае выбрасывает исключение и сама же его ловит, предлагая, как альтернативу Ignore, выбрав которую, получаем продолжение работы программы и нормальное завершение.
И никаких косвенных связей — всё предельно ясно написано в окошке: Run-Time Check Failure #3 — The variable 'a' is being used without being initialized.
Кстати, я даже не думаю, что эта фишка работает через механизм исключений С++. Скорее тут работает отладочное прерывание и его обработчик.