2. Значение глобальной переменной неизвестно на этапе компиляции, например:
char ptype[32];
В этом случае место в исполняемом файле для ptype
не резервируется, но при создании процесса для данной переменной выделяется необходимое количество памяти, заполненной нулями, в сегменте BSS.
3. Переменные автоматического класса хранения, используемые в функциях программы, используют стек. Память для них выделяется при вызове функции и освобождается при возврате. Например:
func1() {
int a;
char *b;
static int с = 4;
...
}
В данном примере переменные а
и b
размещаются в сегменте стека. Переменная с размешается в сегменте инициализированных данных и загружается из исполняемого файла либо во время создания процесса, либо в процессе загрузки страниц по требованию. Более подробно страничный механизм описан в главе 3.
4. Выделение памяти явно запрашивается некоторыми системными вызовами или библиотечными функциями. Например, функция
Напомним, что дополнительная память выделяется из хипа (heap) — области виртуальной памяти, расположенной рядом с сегментом данных, размер которой меняется для удовлетворения запросов на размещение. Следующий за сегментом данных адрес называется
#include
int brk(void *endds);
void *sbrk(int incr);
Системный вызов endds
и, в зависимости от его значения, выделяет или освобождает память (рис. 2.11). Функция incr
. Если значение incr
больше 0, происходит выделение памяти, в противном случае, память освобождается.[23]
Рис 2.11. Динамическое выделение памяти с помощью
Существуют четыре стандартные библиотечные функции, предназначенные для динамического выделения/освобождения памяти.
#include
void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);
void *realloc(void *ptr, size_t size);
void free(void *ptr);
Функция size
число байтов.
Функция nelem
числа объектов, размер которых elsize
. Выделенная память инициализируется нулями.
Функция size
). Увеличение размера может привести к перемещению всей области в другое место виртуальной памяти, где имеется необходимое свободное непрерывное виртуальное адресное пространство.
Функция ptr
.
Указатель, возвращаемый функциями
Упомянутые библиотечные функции обычно используют системные вызовы
Для иллюстрации этого положения приведем небольшую программу, выделяющую и освобождающую память с помощью функций
#include
#include
main() {
char *obrk;
char *nbrk;
char *naddr;
/* Определим текущий брейк-адрес */
obrk = sbrk(0);
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии