Это должно быть разделено на два вопроса:
- Что стандарт C говорит о значении неинициализированного объекта?
- Что находится в памяти, когда вызывается
main
?
Первый вопрос обсуждается в других вопросах и ответах переполнения стека.Полный ответ сложен и включает в себя обсуждение различных обстоятельств, и этот вопрос, похоже, не задает этого вопроса, поэтому я оставлю его для других вопросов переполнения стека.Для этого вопроса достаточно сказать, что использование значения неинициализированного объекта подвержено неопределенному поведению.Кроме того, это не просто потому, что память объекта может иметь проблемные значения, а потому, что стандарт C позволяет реализации C обрабатывать программу, считывающую неинициализированное значение, как некорректно работающую программу различными способами, а оптимизация может затем нарушить работу программы..
Что касается того, что находится в памяти (предположим, у нас есть поддерживаемый способ проверить это, возможно, с использованием языка ассемблера вместо C), то каждая многопользовательская система, которая обеспечивает любые виды безопасности, стирает (илииначе инициализирует) память, прежде чем сделать ее доступной для процесса.Любые значения, которые находятся в памяти во время вызова main
, являются, как предполагает вопрос, либо результатом процесса загрузки, либо инициализации операционной системой.(Обратите внимание, что результат процесса загрузки включает в себя как загрузку постоянных данных, так и текста программы - поэтому мы ожидаем найти там определенные значения - и любые данные, оставшиеся после работы, выполняемой кодом загрузки, - их переменные и так далее.)
Вопрос требует четкого ответа, поэтому позвольте мне прояснить это: операционная система, которая обеспечивает безопасность пользовательских процессов должна стереть данные предыдущих процессов из памяти перед созданием этой памятидоступны для другого процесса.Безопасность не может быть обеспечена , если доверять программе не проверять выделенную ей память и делать с ней все, что ей нужно.
Элементарные системы, не предназначенные для совместного использования ненадежными пользователями, могут, конечно, пропускатьинициализация памяти при создании новых процессов и выделении памяти для них.