La prueba si (+ allocbuf ALLOCSIZE - allocp> = n) { comprueba si hay espacio suficiente para satisfacer una petición de n caracteres. Si existe, el nuevo valor de allocp sería como máximo uno más allá del final de allocbuf.
El código que se refiera a:
#define ALLOCSIZE 10000 /* size of available space */
static char allocbuf[ALLOCSIZE]; /* storage for alloc */
static char *allocp = allocbuf; /* next free position */
char *alloc(int n)
/* return pointer to n characters */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
allocp += n;
return allocp - n; /* old p */
} else
/* not enough room */
return 0;
}
void afree(char *p) /* free storage pointed to by p */
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
Entonces, ¿cómo se puede estar más allá de la última posición en allocbuf? Que en mi opinión es allocbuf [9999]
Cualquier cosa más allá de eso, por ejemplo. allocbuf [10000] es incorrecto y es una pérdida de memoria, ¿verdad?
La segunda parte de la pregunta - que a pesar de que afree función de acuerdo a su nombre está suprimiendo el valor guardado en lugares particulares de una matriz. Sin embargo, como puedo ver, ¿solo mueve el "cabezal de grabación" solo unos pocos lugares a la izquierda de una matriz? Los datos guardados allí permanecen intactos.
+1, para el hallazgo. – perilbrain
Si 'allocp' apunta a' allocbuf [10000] ', esto significa que el almacenamiento se utiliza por completo (la última división tenía exactamente' n' entradas) y por lo tanto una subsecuente 'alloc()' devolverá '0'. La cita no dice que se permite el uso de este puntero "ilegal", y de hecho no se devuelve de 'alloc()'. – evnu
Para su información, acceder a la memoria más allá de la que se le asignó es un desbordamiento, no una pérdida de memoria. Una pérdida de memoria está perdiendo la pista de la memoria asignada por lo que no puede liberar esa memoria más adelante. –