В главе Арифметика адресов функция afree
определяется следующим образом:
static char allocbuf[ALLOCSIZE]; // storage for alloc
static char *allocp = allocbuf; // next free position
void afree(char *p)
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
Насколько я вижу, смысл оператора if в том, чтобы проверить, находится ли p
в пределах буфера.
Однако, если p
находится за пределами буфера, сравнение приводит к неопределенному поведению, не так ли? Разве нет необходимости преобразовывать оба указателя (p
и allocbuf
) в целые числа перед выполнением сравнения?
Должна ли функция выглядеть не так или эта версия вообще неверна?
void afree(char *p)
{
uintptr_t p_int = (uintptr_t) p;
uintptr_t a_start = (uintptr_t) allocbuf;
uintptr_t a_end = (uintptr_t) (allocbuf + ALLOCSIZE);
if (p_int >= a_start && p_int < a_end)
allocp = p;
}