На языке C существует 3 различных типа продолжительности хранения:
- stati c: время жизни переменной - это время жизни программы. Он выделяется во время загрузки (определяется только во время компиляции) и освобождается только тогда, когда операционная система выгружает программу. Переменные Stati c - это переменные, объявленные вне любых функций, а локальные переменные (объявленные в функции или блоке), имеющие модификатор
static
- automati c: переменные automati c объявлены внутри блока (или функция), без модификатора хранилища. Их время жизни начинается в начале блока c и заканчивается в конце блока c. Они обычно размещаются в начале блока blo c и освобождаются в его конце, но из-за правила «как будто» оптимизирующие компиляторы могли бы распределить их раньше и освободить их позже, например, если блок blo c находится внутри oop.
- dynamici c: они распределяются вручную через
malloc
и будут освобождены только free
В общих реализациях системный стек используется для автоматизации c переменные и пул памяти (запрашивая у операционной системы, когда требуется больше памяти) для динамических c переменных, но это детали реализации
При использовании многопоточности четвертый тип длительности хранения доступно: продолжительность хранения потока. Эти переменные объявляются с модификатором класса хранения _Thread_local
. Их время жизни - это продолжительность потока, и каждый поток имеет свою собственную копию.
Для обычной реализации они управляются так же, как переменные stati c: они выделяются операционной системой, когда поток создается и восстанавливается (все еще ОС), когда поток заканчивается.
Некоторые замечания относительно ваших формулировок:
Stati c выделение памяти - это происходит во время время компиляции.
Осторожно, время компиляции и время загрузки различаются. Во время сборки создается только файл, а память выделяется системой только во время выполнения
Stati c освобождение памяти - память освобождается автоматически после завершения работы блока / функции ( для локальных переменных) ...
Существует путаница между областью действия (локальной и глобальной) и продолжительностью хранения. Функция может содержать переменные stati c, что является одной из причин ключевого слова static
Dynami c выделение памяти - память выделяется во время выполнения , поскольку в данный момент размер ввода неизвестен
Это одна из возможных причин для программиста использовать динамическую память c, но могут быть и другие, например, потому что код будет будь таким чище. В частности, динамическая c память - хороший инструмент, когда вы хотите имитировать c объектно-ориентированное программирование на C языке.