Почему локальные функции (auto
класс хранения) не инициализируются, когда все остальное?
C близко к оборудованию; это его величайшая сила и самая большая опасность. Причина, по которой auto
объекты класса хранения имеют случайные начальные значения, заключается в том, что они размещены в стеке, и было принято решение о том, чтобы автоматически не очищать их (частично потому, что их необходимо очищать при каждом вызове функции).
С другой стороны, не auto
объекты должны быть очищены только один раз. Кроме того, ОС в любом случае должна очищать выделенные страницы из соображений безопасности. Таким образом, дизайнерское решение здесь заключалось в том, чтобы указать нулевую инициализацию. Почему безопасность тоже не проблема со стеком? На самом деле это очищается, во-первых. Мусор, который вы видите, связан с более ранними примерами фреймов вызовов вашей собственной программы и библиотечного кода, который они вызвали.
Конечный результат - быстрый, эффективный для памяти код. Все преимущества сборки без единой боли. До того, как dmr изобрел C, "HLL", такие как ядра Basic и целые ОС, были в буквальном смысле реализованы как гигантские ассемблерные программы. (За некоторыми исключениями в таких местах, как IBM.)