Почему глобальные переменные инициализируются нулем, а локальные - мусором по умолчанию?

Почему глобальные и статические переменные инициализируются нулем, а локальные - рандомными значениями по умолчанию?


Ответы (2 шт):

Автор решения: n 1 k z z z

Локальные переменные создаются при вызове функции и хранятся на стеке(не всегда, например они могут помещаться в регистры). Соответственно при каждом вызове функции они заново помещаются в стек и обычно принимают значение того объекта, который лежал по этому адресу ранее, я не могу сказать точно с чем это связано, скорее всего это сделано для оптимизации. А вот глобальные и статические переменные каждый раз не пересоздаются, они существуют с самого начала выполнения программы и имеют фиксированную ячейку памяти, соответственно проще всего их будет инициализировать нулевым значением. По идее их можно инициализировать не только нулем, но ничего не поменяется в том плане, что их значение всегда будет оставаться фиксированным.

→ Ссылка
Автор решения: ТарасПрогер

У бинаря во многих ОСях есть несколько различных секций(еще их могут называть сегментами):

  1. Секция .text - для исполняемого кода
  2. Секция .data - для инициализированных данных
  3. Секция .bss - для неинилизированных данных
  4. Секция стека - писать, что это такое, долго, но главное понять, что в основном она используется для реализации возрата управления из функций, для передачи в нее аргументов и для хранения в функции локальных переменных

По итогу, что имеем: Все локальные переменные хранятся на стеке, а так как он может использоваться и для много чего другого, то при выделении памяти в этом месте, он может содержать в себе что угодно(значения локальных переменных, оставшиеся после работы других функций и т.д). Поэтому неинициализированные локальные переменные содержат в себе мусор. Другая ситуация с глобальными и статическими переменными, если они инициализированы, то они хранятся в секции .data. Если они неинициализированы, то тогда компилятор помещает их в секцию .bss - а в ней при старте программы хранятся нули, вот и получаем, что неинициализированные глобальные и статические переменные содержат 0

→ Ссылка