10 787 subscribers

Язык С: классы памяти

<100 full reads
Язык С: классы памяти
Язык С: классы памяти

Источник: Nuances of Programming

Предыдущая статья: “Язык C: константы и литералы

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

  • auto (автоматический);
  • register (регистровый);
  • static (статический);
  • extern (внешний).

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

Все локальные переменные по умолчанию принадлежат классу памяти auto, то есть являются автоматическими.

{
int mount;
auto int month;
}

В приведенном примере две переменные определены в одном классе памяти. Использование auto возможно только внутри функций, т.е. для создания локальных переменных.

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

Класс памяти register используется для определения локальных переменных, которые должны храниться в регистре процессора, а не в оперативной памяти. Это означает, что переменная имеет максимальный размер, равный размеру регистра (обычно одно слово), и к ней не может быть применен унарный оператор & (из-за отсутствия места в памяти).

{
register int miles;
}

Класс register следует использовать только для переменных, требующих быстрого доступа, таких как счетчики. Следует также отметить, что определение register не означает, что переменная обязательно будет храниться в register. Это означает, что она МОЖЕТ храниться в register в зависимости от аппаратных ограничений и ограничений, связанных с выполнением программы.

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

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

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

В программировании на языке С применение static к глобальной переменной приводит к тому, что только один экземпляр этого члена разделяется всеми объектами его класса:

#include <stdio.h>

/* объявление функции */
void func(void);

static int count = 5; /* глобальная переменная*/

main() {
while(count--) {
func();
}

return 0;
}

/* определение функции */
void func( void ) {
static int i = 5; /* локальная статичная переменная */
i++;

printf("i is %d and count is %d\n", i, count);
}

Результат:

i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0

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

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

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

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

Первый файл: main.c

#include <stdio.h>

int count ;
extern void write_extern();

main() {
count = 5;
write_extern();
}

Второй файл: support.c

#include <stdio.h>

extern int count;

void write_extern(void) {
printf("count is %d\n", count);
}

Как видите, extern используется для объявления count во втором файле, тогда как определение count находится в первом файле main.c. Теперь скомпилируем эти два файла следующим образом:

$gcc main.c support.c

Получится исполнимая программа a.out. Ее выполнение приведет к следующему результату:

count is 5

Читайте также:

Читайте нас в Telegram, VK