Унифицированное значение типа int всегда одинаково (C ++) - PullRequest
1 голос
/ 06 апреля 2011

Учитывая этот код:

void main()
{
int x; 
cout << x;
system("pause");
}

Когда я отлаживаю этот кусок кода, он всегда печатает -858993460A. Я прочитал это потому, что VS установил это как значение по умолчанию для унифицированных переменных. Но я также читал, что в режиме выпуска это должно получить случайное значение. Но каждый раз, когда я запускаю этот код в режиме выпуска, я получаю 1772893972A , который не меняется -> это не случайно. Что это? Почему я получаю это значение?

Ответы [ 3 ]

3 голосов
/ 06 апреля 2011

Ваша путаница заключается в предположении, что "в режиме выпуска это должно получить случайное значение".Это не так.

Неинициализированная переменная получает неопределенное значение.Это может быть случайным, но не обязательно.

Если вы хотите, чтобы x имел случайное значение, используйте rand ().

1 голос
/ 06 апреля 2011

main не является реальной точкой входа исполняемого файла, в общем случае реальная точка входа берется библиотекой времени выполнения (и в VC ++ определенно так), которая выполняет некоторые задачи инициализации CRT и затем вызывает ваш main , Это значение, вероятно, является остатком одного из вызовов функций, выполняемых кодом инициализации; Разница между сборками Debug и Release, вероятно, связана с разным управлением инициализацией / стеком между двумя конфигурациями. Кстати, это просто вероятность того, что такие значения всегда одинаковы, возможно, они принадлежат некоторому параметру / переменной, каждый раз принимающим одно и то же значение.

Если это не так, возможно, это что-то из какой-то другой задачи инициализации, встроенной в ваш процесс. Это не что-то из других процессов или просто «случилось», чтобы быть в этом месте в физической памяти, так как Windows (на которой запущено ваше приложение) никогда не отдает страниц памяти, которые принадлежали другим процессам, без предварительной их очистки.

Тем не менее, имейте в виду, что для стандарта неинициализированные переменные имеют " неопределенное начальное значение " (§3.3.1 ¶9), поэтому вам не следует полагаться на значения, которые вы может получить, читая неинициализированные переменные. Если вам нужны случайные числа, используйте соответствующие библиотечные функции.

<ч />

Я забыл ... void main не является допустимым C ++, он должен быть int main (§3.6.1 ¶2, "Он должен иметь тип возврата типа int" ).

0 голосов
/ 06 апреля 2011

Интересно, что ваше значение DEBUG в шестнадцатеричном формате равно 0xFFFFFFFFCCCCCCCC. Ваше значение RELEASE в гексе просто случайно. Может случиться так, что отладочная компиляция добавляет стековый скрайблер, чтобы убедиться, что ваши неинициализированные значения не являются нормальными (например, 0) и будут быстро заметны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...