C ++: мусор неинициализированных переменных - PullRequest
2 голосов
/ 17 апреля 2010
int myInt;
cout << myInt; // Garbage like 429948, etc

Если я вывожу и / или работаю с неинициализированными переменными в C ++, каковы их предполагаемые значения?

  • Фактические значения в памяти от «последнего пользователя»?

например: Программа A закрыта, у нее есть int со значением 1234 в 0x1234 -> Я запускаю свою программу, myInt получает адрес 0x1234, я выводю ее как выше -> 1234

  • Это просто случайный мусор?

Ответы [ 5 ]

11 голосов
/ 17 апреля 2010

«Случайный мусор», но с акцентом на «мусор», не на «случайный» & ndash; т.е. абсолютно произвольный мусор без какой-либо гарантии "случайности" - ndash; системам компилятора и среды исполнения разрешено иметь абсолютно все (некоторые системы могут всегда давать нули, другие могут давать произвольно разные значения и т. д. и т. д.).

5 голосов
/ 18 апреля 2010

Это даже не гарантируется как значение. При попытке прочитать int может произойти все что угодно (например, посланный сигнал, вызывающий завершение вашей программы). Особенно важное значение в программировании в реальной жизни имеет включение неинициализированного bool, которое может привести к попаданию ни в true, ни в false случаях.

4 голосов
/ 17 апреля 2010

Его значение не определено. (§8.5 / 9)

Нет смысла пытаться извлечь из него значимые данные. На практике это как раз то, что случилось там.

Большинство компиляторов упаковывают "значимые" отладочные данные в отладочную сборку. Например, MSVC будет инициализировать вещи в 0xCCCCCCCC. Конечно, это удаляется в оптимизированной сборке.

2 голосов
/ 18 апреля 2010

Программа A закрыта, она имеет значение int со значением 1234 в 0x1234 -> Я запускаю свою программу, myInt получает адрес 0x1234 ...

Также обратите внимание, что из-за виртуальной памяти в современной операционной системе то, что Программа A назвала адресом 0x1234, вряд ли фактически будет ссылаться на то же пространство в физической памяти, что и ваша программа, называющее адресом 0x1234.

2 голосов
/ 17 апреля 2010

целое число является переменной в стеке, так как это локальная переменная. Пока это не было инициализировано, данные в стеке как есть. Это (часть) ранее использованных данных. Таким образом, это мусор, но это не случайно, так как с учетом исполняемого файла и начального состояния, значение является предсказуемым. Прогнозировать сложно, так как нужно учитывать операционную систему, компилятор и т. Д. Кроме того, это очень бессмысленно.

...