- Модель памяти в языке Си
-
Модель памяти в языке Си — система хранения объектов в языке Си.[1]
Способ хранения объекта в языке Си определяет его время жизни — часть времени выполнения программы, во время которого объект существует или для него зарезервировано место. Объект имеет постоянный адрес и сохраняет своё последнее значение. Запрещается обращаться к объекту, который перестал существовать, при этом, если при работе с объектом использовался указатель, его значение остаётся неопределённым.
Существует три способа хранения объектов: автоматический, статический и динамический.[1]
Свойство Автоматический тип Статический тип Динамический тип Объявление Объект без связывания и без static
Имеет внутреннее или внешние связывание или объявлен с квалификатором static
Выделен с помощью malloc Время существования Блок, в котором объявлен объект Всё время выполнения программы От вызова malloc до вызова free Инициализация Отсутствует в случае отсутствия явной инициализации Происходит один раз до запуска программы Частично в случае calloc Размер Любой, неизменяемый Фиксированный, неизменяемый Любой, изменяемый Статический объект можно инициализировать явно, либо использовать умалчиваемую инициализацию.
При использовании функции calloc все объекты имеют нулевое значение кроме чисел с плавающей запятой и указателей.[2]
Выражения, не являющиеся lvalue, связанные с обращением к массиву, являющегося членом структуры (
struct
) или объединения (union
) имеют время существования, ограниченное оценкой такого выражения.[1]Си-строки, которыми инициализируются указатели
char*
, имеют статический тип хранения и не должны изменяться.[3]Динамическая память
Ни один объект не может находиться в динамической памяти без явного указания программиста. Для работы с динамической памятью существуют функции
malloc
,calloc
,realloc
иfree
. Поскольку функции, выделяющие память, принимают размер в переменной типа size_t, максимальный объём выделяемой памяти ограниченSIZE_T_MAX
.[1]Функции malloc и calloc выделяют память, которая после использования должна быть освобождена с помощью вызова free. После освобождения значение указателя остаётся неопределённым. Функция realloc возвращает указатель на изменённый блок памяти, если запрос не может быть удовлетворён, размер блока памяти не изменяется.[1]
#include <stdlib.h> void foo (void *ptr, size_t size) { ptr = realloc (ptr, size+128); /* утечка памяти, если realloc вернёт NULL */ if (!ptr) { ... } }
При работе с динамической памятью возможны утечки памяти и ошибки двойного освобождения блока.
Пример
#include <stdlib.h> #include <string.h> static int x; /* 0 по умолчанию, существует всё время выполнения */ static int y=45; /* 45, существует всё время выполнения */ int main (void) { char arr[50] = "This is object of automatic storage duration"; char *line = "Simple line"; /* имеет статический тип, существует весь период выполнения программы*/ int y; /* значение не определено, существует до выхода из main*/ int z=10; /* значение определено, существует до выхода из main*/ char *ptr; ptr = malloc (50); /* значение не определено, существует до вызова free */ strcpy (ptr, arr); free (ptr); return 0; }
Примечания
Категория:- Язык программирования Си
Wikimedia Foundation. 2010.