Классы памяти в Си. Какие классы памяти существуют в языке си?

Какие классы памяти существуют в языке си?

Что такое класс памяти в си?

Классы памяти в C

Класс памяти auto

Обычная переменная, объявленная внутри блока без указания для неё иного класса, имеет класс памяти auto по умолчанию.

Пример:

int nVar = 5;

Такая переменная видна внутри блока.

Переменные с классом памяти auto размещаются в стеке.

Итак по умолчанию локальная переменная имеет класс памяти auto.

Класс памяти static

Переменные, объявленные как static, т.е. статические, сохраняют своё значение между вызовами. Пример для переменных static:

Получаем: Классы памяти в Си

При втором вызове значение переменной с классом памяти auto, т.е. autoVar в этом примере, потерялось, а значение переменной static, т.е. staticVar в этом примере, сохранилось.

Ещё одна тонкость. static переменная инициализируется только один раз. Если бы это было иначе, то значение статической staticVar обнулилось бы при повторном вызове.

По умолчанию все глобальные переменные являются статическими. И видны они только в своём файле.

Статические функции в Си

Если функция объявлена как static, т.е. статическая, то она видна только в своём файле. Из другого файла к static функции обратиться нельзя. Таким образом, ключевое слово static применительно к функциям в C означает их закрытость для обращений из других файлов программы. Пример. Объявим в отдельном модуле две функции: одну статическую, а другую обычную:

static функция staticFunc будет доступна только в данном модуле. Простая функция simpleFunc доступна для других модулей программы, т.е. её класс памяти extern. Память extern устанавливается для функций по умолчанию. Код основного модуля:

Строка, закрытая комментарием, ошибочна, ведь статическая функция staticFunc объявлена в другом модуле, а значит недоступна в основном модуле.

Класс памяти extern в C

Класс памяти extern в C используем в двух случаях:

  • если переменная объявляется в программе ниже, чем ссылка на неё;
  • если переменная объявлена в другом модуле.

Пример основного модуля:

и другого модуля программы:

Получаем: Класс памяти extern в C

Класс памяти register в C

Применение модификатора register есть рекомендация компилятору хранить данную переменную в регистре, а не в оперативной памяти. Не факт, что так и будет. Если программа часто обращается к переменной, то есть смысл объявить её с модификатором register. Пример:

register int nVar;

Применять register можно только к near указателям и целому типу. Использовать register можно и при указании формальных параметров функций. Примеры:

register int nVar;
int func(register int var);