Спецификатор класса хранения контролирует хранилище и связь ваших переменных. Это две разные концепции.
C определяет следующие спецификаторы для переменных: auto, extern, register, static.
Хранение
Длительность хранения определяет, как долго ваша переменная будет жить в оперативной памяти.
Существует три типа продолжительности хранения: статическое, автоматическое и динамическое.
статические
Если ваша переменная объявлена в области видимости файла, или имеет внешний или статический спецификатор, она будет иметь статическое хранилище. Переменная будет существовать до тех пор, пока выполняется программа. Время создания этих переменных не тратится.
автоматический
Если переменная объявлена в функции, но без внешнего или статического спецификатора, она имеет автоматическое сохранение. Переменная будет существовать только во время выполнения функции. Как только вы вернетесь, переменная больше не будет существовать. Автоматическое хранение обычно выполняется в стеке. Создание этих переменных - очень быстрая операция (просто увеличьте указатель стека на размер).
динамический
Если вы используете malloc (или новый в C ++), вы используете динамическое хранилище. Это хранилище будет существовать, пока вы не позвоните бесплатно (или не удалите). Это самый дорогой способ создания хранилища, поскольку система должна динамически управлять распределением и освобождением.
Связь
Связывание указывает, кто может видеть и ссылаться на переменную. Существует три типа связи: внутренняя связь, внешняя связь и отсутствие связи.
без связи
Эта переменная видна только там, где она была объявлена. Обычно применяется к переменным, объявленным в функции.
внутренняя связь
Эта переменная будет видна всем функциям в файле (называемом единицей перевода ), но другие файлы не будут знать, что она существует.
внешняя связь
Переменная будет видна другим переводчикам. Их часто считают «глобальными переменными».
Вот таблица, описывающая характеристики хранения и связи на основе спецификаторов
Storage Class Function File
Specifier Scope Scope
-----------------------------------------------------
none automatic static
no linkage external linkage
extern static static
external linkage external linkage
static static static
no linkage internal linkage
auto automatic invalid
no linkage
register automatic invalid
no linkage