Проблема неинициализированной переменной

Товарищи! Столкнулся с таким феноменом: обычно если объявленную, но неинициализированную переменную попытаться подставить в арифметическое выражение — программа «ругается» и выдает сообщение об ошибке.
Но! Если после объявления переменной (опять же без ее инициализации!!!) просто вывести на экран ее адрес:

int a;
cout <<  &a << endl;
a += 10; //теперь так можно

(причем даже если это сделать так: printf("&a=%i", &a); )
можно дальше пользоваться этой переменной уже как инициализированной — в качестве ее значения будет «мусор», который располагался в выделенном под нее адресе.
Тот же эффект достигается, если после неинициализированной переменной объявить указатель и связать его с адресом этой переменной:

int a;
int* pin = &a;
a += 10; //теперь так можно

ПОЧЕМУ ??? Как это «подменяет» настоящую инициализацию???

Константин, и тебе привет от отладочной версии CRT (C++ Run-Time system — исполняющая система языка С++). Это она «ругается» на неинциализированную переменную. Если перекомпилируешь программу в конфигурации Release, то никаких лишних сообщений не будет, а содержимым неинициализированной переменной будет мусор.

Если перекомпилируешь программу в конфигурации Release, то никаких лишних сообщений не будет,

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

Ему уже подробно ответили на другом форуме.

Не будет там необработанного исключения. Переменная определена, память для неё выделена. С чего бы исключению подняться?

Если runtime-библиотека «ругается» в режиме отладки, значит выбрасывается исключение.
По какой причине оно выбрасывается — это уже другой вопрос.
Это может быть косвенно связано с неинициализированной переменной. Нужно смотреть стек вызовов.

Runtime-библиотека «ругается» в режиме отладки на неинициализированную переменную потому, что она заточена на это (ну и не только на это, конечно). Мало того, Debug-CRT ещё и инициализирует эту «неинициализированную» переменную магическим числом 0xffffffffcccccccc. А ещё она в нашем случае выбрасывает исключение и сама же его ловит, предлагая, как альтернативу Ignore, выбрав которую, получаем продолжение работы программы и нормальное завершение.

И никаких косвенных связей — всё предельно ясно написано в окошке: Run-Time Check Failure #3 — The variable 'a' is being used without being initialized.

Кстати, я даже не думаю, что эта фишка работает через механизм исключений С++. Скорее тут работает отладочное прерывание и его обработчик.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.