2012-07-02 9 views
5

En la K & R, capítulo 8, tiene una implementación personalizada de las funciones putc y getc. En la primera definición de getc, si el parámetro es stdin, de acuerdo con la definición de _iob, la función intentará escribir en la dirección 0 porque este es el valor que _iob [0] .ptr y _iob [0] .base eran asignado Es esto legal?¿La implementación de getc y putc de K & R es correcta?

Código: http://ideone.com/AIkCA

Definición de _iob:

FILE _iob[20] = { 
{0, (char *) 0, (char *) 0, _READ, 0}, 
{0, (char *) 0, (char *) 0, _WRITE, 0}, 
{0, (char *) 0, (char *) 0, _WRITE, 0} 
}; 
+9

¿Por qué no publica el código en su pregunta y dinos qué edición del libro estás usando? Supongo que no todos aquí tienen una copia del libro a mano para entender de qué estás hablando. – hugomg

+2

Caso de cualquier pregunta futura de este tipo, hay una página de erratas para K & R2 en - al menos, sí. Parece que está caído ahora. Sin embargo, el caché de Google lo tiene. URL omitida *) Si encuentra algún error aún no descubierto, el mundo de la programación de C se sorprenderá. Se llama nuestra Biblia después de todo. Lo hemos estudiado * duro *. –

+1

El sitio cm.bell-labs.com ha vuelto ahora y el enlace todavía no funciona. Aquí está de nuevo: http://cm.bell-labs.com/cm/cs/cbook/2edi ffs.html –

Respuesta

1

Suponiendo que ambos tienen el mismo código en frente de nosotros, la respuesta es no.

#define getc(p) (--(p)->cnt >= 0 \ 
    ? (unsigned char) *(p)->ptr++ : _fillbuf(p)) 

stdin se inicializa con cnt==0, por lo que esta definición de getc se bifurcará a _fillbuf (sin mirar a (p)->ptr), y _fillbuf tiene un código especial para el caso fp->base == NULL y establece tanto base y ptr de memoria asignada.

+0

Gracias, expliqué lo mismo en mi respuesta también. – Gtiou

0

Me está costando mucho seguir lo que se me pide, pero del uso de "personalizado" en la pregunta, un ángulo para ver esto es si reemplazar getc y putc con estas definiciones en un sistema existente es válido , y la respuesta es no. El ejemplo en K & R le muestra una forma de escribir la biblioteca stdio, no algo que pueda funcionar con una implementación existente (posiblemente muy diferente) de stdio.

0

En realidad, estaba equivocado.

En la primera llamada de getc (stdin), el contador será 0, por lo que - (p) -> cnt no será> = 0, por lo que se invocará _fillbuf. Entonces fillbuf asignará buffer y luego leerá de stdin con el comando read (fp-> cnt = read (fp-> fd, fp-> ptr, bufsize).

Cuestiones relacionadas