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



         

Адресная арифметика - часть 2


define null 0 /* pointer value for error report */ define allocsize 1000 /* size of available space */

static char allocbuf[allocsize];/* storage for alloc */ static char *allocp = allocbuf; /* next free position */

char *alloc(n) /* return pointer to n characters */ int n; ( if (allocp + n <= allocbuf + allocsize) { allocp += n; return(allocp - n); /* old p */ } else /* not enough room */ return(null); )

free(p) /* free storage pointed by p */ char *p; ( if (p >= allocbuf && p < allocbuf + allocsize) allocp = p; )

Дадим некоторые пояснения. Вообще говоря, указатель может быть инициализирован точно так же, как и любая другая переменная, хотя обычно единственными осмысленными значениями являются null (это обсуждается ниже) или выражение, включающее адреса ранее определеных данных соответствующего типа.

описание

static char *allocp = allocbuf;

определяет allocp как указатель на символы и инициализирует его так, чтобы он указывал на allocbuf, т.е. на первую свободную позицию при начале работы программы. Так как имя массива является адресом его нулевого элемента, то это можно было бы записать в виде

static char *allocp = &allocbuf[0];

используйте ту запись, которая вам кажется более естественной. С помощью проверки

if (allocp + n <= allocbuf + allocsize)

выясняется, осталось ли достаточно места, чтобы удовлетворить запрос на n символов. Если достаточно, то новое значение allocp не будет указывать дальше, чем на последнюю позицию allocbuf. Если запрос может быть удовлетворен, то alloc возвращает обычный указатель (обратите внимание на описание самой функции). Если же нет, то alloc должна вернуть некоторый признак, говорящий о том, что больше места не осталось. В языке "C" гарантируется, что ни один правильный указатель данных не может иметь значение нуль, так что возвращение нуля может служить в качестве сигнала о ненормальном событии, в данном случае об отсутствии места. Мы, однако, вместо нуля пишем null, с тем чтобы более ясно показать, что это специальное значение указателя. Вообще говоря, целые не могут осмысленно присваиваться указателям, а нуль - это особый случай.

Проверки вида




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