В C, если переменной не присвоено значение, тогда почему она принимает значение мусора? - PullRequest
2 голосов
/ 13 января 2011

Почему переменные принимают значения мусора?

Ответы [ 7 ]

7 голосов
/ 13 января 2011

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

Если компилятор автоматически сбрасывает (то есть: инициализирует в 0 или в NaN для float / double и т.д.переменных, это займет некоторое время (потребуется запись в память).
Во многих случаях инициализация переменных может не потребоваться: возможно, вы никогда не получите доступ к своей переменной или напишите в нее при первом обращенииit.

Сегодня эта оптимизация спорна: накладные расходы из-за инициализации переменных, возможно, не стоят проблем, вызванных переменными, неинициализированными по ошибке, но когда был определен C, все было иначе.

6 голосов
/ 13 января 2011

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

3 голосов
/ 13 января 2011

С чего бы это не ? Лучший вопрос может быть: «Можете ли вы объяснить, как получается, что переменная-член в C #, которая не инициализирована, имеет известное значение по умолчанию?»

3 голосов
/ 13 января 2011

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

3 голосов
/ 13 января 2011

Требуется только то, что находится в памяти по адресу, на который указывает переменная.

2 голосов
/ 13 января 2011

Это происходит с локальными переменными и памятью, выделенной из кучи с помощью malloc ().Локальные переменные - более типичная ошибка.Они хранятся в стековом фрейме функции.Который создается просто путем настройки указателя стека на объем памяти, необходимый для локальных переменных.

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

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

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

2 голосов
/ 13 января 2011

Когда переменная объявляется в C, она включает в себя только назначение памяти переменной, а не неявное присвоение. Таким образом, когда вы получаете значение из него, оно имеет то, что хранится в памяти, приведенной к типу вашей переменной. Это значение мы называем значением мусора. Это остается так, потому что реализации языка C имеют управление памятью, которое не решает эту проблему.

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