Назад к вопросам
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() или при загрузке программы |
Не инициализируются по умолчанию. Требуют явной инициализации | Один раз при первом достижении определения |
| Доступность | Везде в области видимости файла | Только внутри блока кода | Только внутри блока кода |