Поделиться через


Время существования

"Время жизни" представляет собой период во время выполнения программы, в течение которого существует переменная или функция. Время жизни идентификатора определяется длительностью его хранения.

Идентификатор, объявленный описателем класса храненияstatic, имеет статическую длительность хранения. Идентификаторы со статической длительностью хранения (также называемые "глобальными") имеют выделенную память и определенное значение в течение всего времени выполнения программы. Выделение памяти и инициализация хранящегося значения идентификатора производятся только один раз перед началом работы программы. Идентификатор, объявленный с внешней или внутренней компоновкой, также имеет статическую длительность хранения (см. статью Компоновка).

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

Следующие правила определяют, имеет ли идентификатор глобальное (статическое) или локальное (автоматическое) время жизни:

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

  • Если локальная переменная имеет инициализатор, она инициализируется при каждом создании (если она не объявлена как static ). Параметры функции также имеют локальное время жизни. Для идентификатора можно определить глобальное время существования в пределах блока, включив в его объявление описатель класса хранения типа static . Если переменная объявлена как static , она сохраняет свое значение между последовательными входами в блок.

Хотя идентификатор с глобальным временем существования существует в течение всего времени выполнения исходной программы (например, внешне объявленная переменная или локальная переменная, объявленная с ключевым словом static ), он может быть доступен не во всех частях программы. Сведения о видимости приводятся в статье Область и видимость, а нетерминальный описатель storage-class-specifier рассматривается в статье Классы хранения в C.

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

См. также

Время жизни, область, видимость и компоновка