Назад к вопросам
Junior
120
questionbank

Когда и как долго существуют глобальные и локальные переменные в C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Глобальные переменные

  • Время существования: С момента запуска программы до ее завершения.
  • Место хранения: Обычно в статической области памяти (.data или .bss секции исполняемого файла).
  • Инициализация:
    • Нестатические глобальные переменные, определенные на уровне файла, с нетривиальными конструкторами инициализируются до вызова main().
    • Глобальные переменные с нулевой инициализацией (например, int i = 0;) также инициализируются до main().
    • Переменные, определенные с const или имеющие статический срок хранения, инициализируются при загрузке программы.
  • Доступность: Видны во всех функциях в пределах области видимости.

Локальные переменные

  • Время существования: С момента определения переменной внутри блока кода (функции, цикла, условного оператора и т.д.) до выхода из этого блока.
  • Место хранения: Обычно на стеке (для автоматических переменных). Статические локальные переменные хранятся в статической области памяти.
  • Инициализация:
    • Автоматические локальные переменные не инициализируются по умолчанию (содержат "мусор"). Требуют явной инициализации.
    • Статические локальные переменные инициализируются один раз при первом достижении их определения.
  • Доступность: Видны только внутри блока кода, где они определены.

Примеры

// Глобальная переменная
int global_variable = 10;

void some_function() {
    // Локальная переменная (автоматическая)
    int local_variable_1; // Неинициализированная

    // Локальная переменная (автоматическая) с инициализацией
    int local_variable_2 = 20;

    // Статическая локальная переменная
    static int static_local_variable = 30; // Инициализируется один раз

    // Доступ к глобальной переменной
    global_variable++;

    // Доступ к локальным переменным
    local_variable_1 = global_variable;
    static_local_variable++;

    // После выхода из some_function(), local_variable_1 и local_variable_2 перестают существовать
    // static_local_variable продолжает существовать, сохраняя свое значение
}

int main() {
    some_function();
    some_function(); // static_local_variable сохранила значение
    // Глобальная переменная доступна здесь
    // local_variable_1 и local_variable_2 недоступны

    return 0;
}

Таблица сравнения

Характеристика Глобальные переменные Локальные переменные (автоматические) Статические локальные переменные
Время существования С момента запуска программы до ее завершения С момента определения до выхода из блока кода С первого достижения определения до завершения программы
Место хранения Статическая область памяти (.data, .bss) Стек Статическая область памяти (.data, .bss)
Инициализация До вызова main() или при загрузке программы Не инициализируются по умолчанию. Требуют явной инициализации Один раз при первом достижении определения
Доступность Везде в области видимости файла Только внутри блока кода Только внутри блока кода