Класс памяти - характеристика переменной, которая определяет способ ее хранения .
Язык Си реализует следующие классы памяти:
Характеристики классов памяти:
В табл. 1 обобщаются характеристики классов памяти языка Си. Правильное использование классов памяти улучшает структуру, модульность, повышает удобочитаемость и скорость работы программы.
Таблица 1    
КлассОбласть действияВремя жизниМесто храненияИнициализация массивов, структурЗначение по умолчанию
АвтоматическийБлокИсполнение блокаСтекДаНеопределено
Регистровый *БлокИсполнение блокаМашинный регистрНетНеопределено
Внешний **От объявление до конца файлаИсполнение программыОбласть данныхДа0
Статический внешний***От объявление до конца файлаИсполнение программыОбласть данныхДа0
Статический внутреннийБлокИсполнение программыОбласть данныхДа0

Примечание 1
* — повышение быстродействия
** — доступность из других файлов
*** — недоступность из других файлов
Рис. 1.  Размещение данных различных классов памяти
На рис. 1 показано, как типичный компилятор Си размещает команды и данные компилируемой программы на языке Си. Детали зависят от системы. Например, в некоторых системах стек растет от больших адресов к меньшим, в других справедливо обратное. Команды могут размещаться после данных или наоборот. Стек и области данных могут динамически расширяться посредством системных вызовов.
Раздел команд содержит машинный код, определяющий логику программы. На некоторых машинах этот раздел защищен от записи, так как программы не могут сами себя изменять.
Объектам, размещенным в области данных, назначается определенное расположение в этой области, остающееся неизменным во время выполнения этой программы (при использовании виртуальных адресов они имеют один и тот же относительный адрес). В этой области размещаются внешние и статические переменные. Если они не инициализируются в программе, то они устанавливаются в нуль перед выполнением программы и "остаются живыми" в течении времени выполнения программы. Строковые константы, например, заключенные в кавычки строки в вызове функции printf(), также запоминаются в этой области.
Стек является динамической областью данных. Память в стеке многократно используется повторно при вызовах функций и выходе из них. На стеке размещаются автоматические переменные и параметры функции.