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

Все переменные в программе характеризуются не только типом, но и классом памяти. В языке Си существует четыре класса памяти:

  • Автоматический (automatic);
  • Регистровый (register);
  • Статический (static);
  • Внешний (external).

Рассмотрим все классы памяти подробнее:

1. Автоматический (automatic)

По умолчанию, локальные переменные имеют класс auto. Такие переменные располагаются на стеке, а их область видимости ограничена своим блоком. Спецификатор auto уведомляет компилятор о том, что локальная переменная, перед именем которой он стоит, создаётся при входе в блок и разрушается при выходе из блока. Все переменные, определённые внутри функции, являются автоматическими по умолчанию, и поэтому ключевое слово auto используется крайне редко. Пример:

int nVar = 5;

2. Регистровый (register)

Когда мы определяем регистровую переменную, то мы просим компилятор, чтобы переменная располагалась в регистре, а не в оперативной памяти. Компилятор может сделать переменную регистровой, если позволяют условия (регистры не заняты, и по мнению компилятора это не приведёт к увеличению издержек). Регистровые переменные определяются с помощью служебного слово register перед типом:

register int x = 20;
register int y = 30;

Так как регистровая переменная не имеет адреса, то к ней не применима операция взятия адреса, это вызовет ошибку во время компиляции. Аргументы функции также могут быть заданы как register. Внутри функции они будут вести себя также, как и регистровые переменные.

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

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

3. Статический (static)

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

Модификатор static можно также применять к глобальным переменным. В этом случае область видимости такой переменной ограничивается файлом, в котором она объявлена, это означает, что переменная будет иметь внутреннюю привязку. Внутренняя привязка говорит о том, что индикатор известен только внутри своего файла. Если функция объявлена как static, то она видна только в своём файле. Из другого файла к static функции обратиться нельзя.

Пример. Объявим в отдельном модуле две функции: одну статическую, а другую обычную:

static int staticFunc(int nVar) //статическая
      {
        return ++nVar;
      }

int simpleFunc(int nVar) //обычная
      {
        return ++nVar;
      }

4. Внешний (external)

Внешние переменные вводятся как противоположные автоматическим. Это глобальные переменные и к ним можно обращаться именами из любой функции. Поскольку внешние переменные доступны везде, их можно использовать для связи между функциями, не пренебрегая механизму формальных параметров.

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

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

Пример:

#include <stdio.h>
int x=145; //Описание внешней переменной
main()
{
extern int x,y;
printf("x=%d y=%d \n",x,y);
}
int y=541; //Описание внешней переменной

Внешние переменные могут определятся вне какой-либо функции при этом выделяется фактическая память. В любой другой функции, обращающейся к этим переменным, они должны описываться с помощью описателя extern.

 
Поделиться в facebook
Facebook
Поделиться в twitter
Twitter
Поделиться в vk
VK
Поделиться в google
Google+
Поделиться в email
Email

Один ответ к “Классы памяти в языке Си”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Группа в VK

Помощь проекту

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Похожие статьи

Структуры в языке Си.

Структуры в языке Си.

Структура в языке Си – это тип данных, создаваемый программистом, предназначенный для объединения данных различных типов в единое целое. Структуры делают программу более модульной, что

 
Функции в языке Си.

Функции в языке Си.

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи. Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана

 
Указатели в языке Си.

Указатели в языке Си.

Указатель — переменная, содержащая адрес объекта. Указатель не несет информации о содержимом объекта, а содержит сведения о том, где размещен объект. Указатели похожи на метки,

 
Массивы в языке Си.

Массивы в языке Си.

Массив – это непрерывный участок памяти, содержащий последовательность объектов одинакового типа, обозначаемый одним именем. Массивы — очень полезные сущности, особенно в тех случаях, когда необходимо

 

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: