Как неинициализированная переменная получает значение мусора? - PullRequest
10 голосов
/ 14 сентября 2009

Когда мы создаем переменную и не инициализируем ее, ей присваивается некоторое (случайное) число, называемое мусорное значение .

  • Как это значение присваивается переменной?
  • Что за этим стоит концепция / механизм?
  • Это происходит только в C?

Ответы [ 5 ]

26 голосов
/ 14 сентября 2009

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

В качестве метафоры подумайте о выделении переменной, например, о покупке участка земли - пока вы не сделаете что-то с ним (например, не построите дом), на земле будет только тот мусор, который там уже находился (например, старый разрушающийся дом).

Некоторые языки автоматически заполняют вновь назначенные переменные нулями - на это нужно время. В более «самодельных» языках, таких как C, это дополнительное поведение не гарантируется (хотя в некоторых системах память очищается независимо от языка, например, в качестве меры безопасности)

6 голосов
/ 14 сентября 2009

Память используется и повторно используется в различных точках вашего приложения. Например, по мере роста и сжатия стека вызовов вашего приложения одно и то же место в памяти может быть перезаписано много-много раз. Следует помнить, что когда часть памяти оставлена, она не обнуляется, поэтому, если вы не укажете новое начальное значение для этого места в памяти при повторном использовании, вы получите старое, «мусорное» значение.

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

2 голосов
/ 14 сентября 2009

Никто явно не присваивает значение мусора. Если вы создаете переменную, определяется только местоположение переменной, а не ее значение. Вот почему мы его инициализируем. Значение мусора может быть получено от некоторых предыдущих операций над той же памятью старыми процессами! Так что он может держать что угодно. Я думаю, что это относится к довольно большому количеству языков. Я не уверен насчет списка! :)

2 голосов
/ 14 сентября 2009

Когда мы создаем переменную и не инициализируем ее, тогда ничего не происходит. Когда вы читаете значение из этой переменной, вы получаете данные из памяти, где сейчас находится переменная. Это может выглядеть как мусор / случайное значение только потому, что переменные помещаются в память с некоторой степенью случайности.

1 голос

C стандарты говорят:

Реализация: подробный анализ реализации по адресу: https://stackoverflow.com/a/36725211/895245 Резюме:

  • local: адрес никогда не записывается, поэтому все, что было там ранее, используется
  • глобальный: .bss
...