Язык программирования Си


         

число единиц памяти для запроса


#define NALLOC 1024 /* миним. число единиц памяти для запроса */
/* morecore: запрашивает у системы дополнительную память */ static Header * morecore(unsigned nu) { char *cp, *sbrk(int); Header *up;
if (nu < NALLOC) nu = NALLOC; cp = sbrk(nu * sizeof(Header)); if (cp == (char *) –1) /* больше памяти нет. */ return NULL; up = (Header *) cp; up->s.size = nu; free((void *)(up+1)); return freep; }
Системный вызов sbrk(n) в UNIXе возвращает указатель на n байт памяти или -1, если требуемого пространства не оказалось, хотя было бы лучше, если бы в последнем случае он возвращал NULL. Константу -1 необходимо привести к типу char *, чтобы ее можно было сравнить с возвращаемым значением. Это еще один пример того, как операция приведения типа делает функцию относительно независимой от конкретного представления указателей на различных машинах. Есть, однако, одна "некорректность", состоящая а том, что сравниваются указатели на различные блоки, выдаваемые функцией sbrk. Такое сравнение не гарантировано стандартом, который позволяет сравнивать указатели лишь в пределах одного и того же массива. Таким образом, эта версия malloc верна только на тех машинах, в которых допускается сравнение любых указателей.
В заключение рассмотрим функцию free. Она просматривает список свободной памяти, начиная с freep, чтобы подыскать место для вставляемого блока. Искомое место может оказаться или между блоками, или в начале списка, или в его конце. В любом случае, если подлежащий освобождению блок примыкает к соседнему блоку, он объединяется с ним в один блок. О чем еще осталось позаботиться, - так это о том, чтобы указатели указывали в нужные места и размеры блоков были правильными.
/* free: включает блок в список свободной памяти */ void free(void *ар) { Header *bp, *p;
bp = (Header *)ap –1; /* указатель на заголовок блока */ for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >- p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* освобождаем блок в начале или в конце */

Содержание  Назад  Вперед