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

Скачать в pdf «Язык программирования C»


До вызова alloc:


allocp v


allocbuf


— Занято— Свободно


После вызова alloc:


_allocp _


allocbuf


— Занято — Свободно -►


#define ALLOCSIZE 10000 /* объем имеющейся памяти */


static char allocbuf[ALLOCSIZE]; /* буфер памяти для alloc */ static char *allocp = allocbuf; /* следующая свободная позиция */


char *alloc(int n) /* возвращает указатель на n символов */

{


if (allocbuf + ALLOCSIZE — allocp >= n) { /* есть место */ allocp += n;


return allocp — n; /* старый p */


} else /* недостаточно места в буфере */ return 0;

}


void afree(char *p)    /* освобождение памяти по адресу р */

{


if (р >= allocbuf && р < allocbuf + ALLOCSIZE) allocp= p;

}


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


static char *allocp = allocbuf;


В нем переменная allocp объявляется указателем на символьные данные и инициализируется адресом начала массива allocbuf, который при запуске программы является указателем на следующую свободную ячейку. Это объявление можно записать и так: static char *allocp = kallocbuf[0];


Здесь используется тот факт, что имя массива — это одновременно адрес его нулевого элемента.


А вот как проверяется, достаточно ли места в буфере, чтобы удовлетворить запрос на п элементов:


if (allocbuf + ALLOCSIZE — allocp >= n) { /* есть место */

Скачать в pdf «Язык программирования C»