Модель памяти в языке Си — система хранения объектов в языке Си.
Способ хранения объекта в языке Си определяет его время жизни — часть времени выполнения программы, во время которого объект существует или для него зарезервировано место. Объект имеет постоянный адрес и сохраняет своё последнее значение. Запрещается обращаться к объекту, который перестал существовать, при этом, если при работе с объектом использовался указатель, его значение остаётся неопределённым.
Существует три способа хранения объектов: автоматический, статический и динамический.
Статический объект можно инициализировать явно, либо использовать умалчиваемую инициализацию.
При использовании функции calloc все объекты имеют нулевое значение кроме чисел с плавающей запятой и указателей.
Выражения, не являющиеся lvalue, связанные с обращением к массиву, являющегося членом структуры (struct) или объединения (union) имеют время существования, ограниченное оценкой такого выражения.
Си-строки, которыми инициализируются указатели char*, имеют статический тип хранения и не должны изменяться.
Ни один объект не может находиться в динамической памяти без явного указания программиста. Для работы с динамической памятью существуют функции malloc, calloc, realloc и free. Поскольку функции, выделяющие память, принимают размер в переменной типа size_t, максимальный объём выделяемой памяти ограничен SIZE_T_MAX.
Функции malloc и calloc выделяют память, которая после использования должна быть освобождена с помощью вызова free. После освобождения значение указателя остаётся неопределённым. Функция realloc возвращает указатель на изменённый блок памяти, если запрос не может быть удовлетворён, размер блока памяти не изменяется.
1#include <stdlib.h> 2 3void foo (void **ptr, size_t size) 4{ 5 *ptr = realloc (*ptr, size+128); /* утечка памяти, если realloc вернёт NULL */ 6 if (!*ptr) 7 { 8 ... 9 } 10}При работе с динамической памятью возможны утечки памяти и ошибки двойного освобождения блока.