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

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

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

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

int nVar = 5;

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

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

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

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

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

Получаем: C static

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

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

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

Наверх

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

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

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

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

Наверх

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

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

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

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

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

Получаем: C Extern

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

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

register int nVar;

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

register int nVar;
int func(register int var);
Быстрый поиск: Язык C. Java и базы данных