2011-07-06 10 views
5

El paso por K & RI también un vistazo al siguiente código:C Array/Puntero problema

#define ALLOCSIZE 1000 
static char allocbuf[MAXLINE]; 
static char *allocp = allocbuf 

char *alloc(int n){ 
     if (allocbuf+ALLOCSIZE-allocp>=n){ 
       allocp+=n; 
       return allocp-n; 
     } 
     else { ... } 

Me temo que mi pregunta es muy simple, pero no puedo conseguir mi cabeza alrededor de la "si "línea" ¿Qué valor está tomando allocbuf? Es una matriz de caracteres, ¿verdad? Miré hacia atrás en el material del libro, pero no ayudó. allocp apunta inicialmente al elemento zeroth de la matriz, ¿verdad?

+0

¿Qué es ALLOCSIZE? también importa que allocbuf sea una constante (la dirección de la matriz) por lo que no puede tomar ningún otro valor. – deStrangis

+0

Creo que falta algo en el código –

+0

Lo siento, escribí la línea #define incorrecta ... edición –

Respuesta

2

allocbuf es una matriz de tipo char [], pero en muchos contextos, el identificador mismo se desintegra a un puntero de tipo char *, que contiene la dirección inicial de la matriz. Tenga en cuenta que esto no significa que allocbuf es un puntero, todavía es una matriz.

Por lo tanto, la condición de la instrucción if realiza una cierta aritmética del puntero.

+0

Pero no debería El enunciado if es: if (pntr + ALLOCSIZE-allocp> = n), donde char * pntr = & allocbuf? –

+0

Tiene toda la razón al respecto, esta es la forma correcta, en principio. Es solo que C tiene una sintaxis de acceso directo que hace que 'allocbuf' sea lo mismo que' & allocbuf' en este contexto. –

+0

Gracias. Además, ¿en qué otros "contextos" podemos hacer esto? El compilador implicará todas las operaciones aritméticas para indicar el puntero a la matriz. –

0

Piense en allocbuf como el puntero al comienzo de su RAM, digamos 0. Entonces allocbuf + ALLOCSIZE apuntará al final de su RAM. allocp apunta al final de la región asignada, en algún lugar en el medio de su RAM. Entonces allocbuf + ALLOCSIZE-allocp te dará el tamaño de memoria libre. La instrucción if verifica si el tamaño de asignación solicitado (n) es menor que la memoria libre disponible.

+0

Entiendo la aritmética. El libro tiene una buena imagen para ayudar a explicarlo. Es el uso de un nombre de matriz como un puntero a la matriz. No puedo entenderlo. –

0

allocbuf es una matriz estática, en realidad apunta al primer elemento del conjunto contiguo de caracteres (la matriz). allocp es otro puntero a la matriz contigua y puede cambiar su valor para apuntar a los elementos de la matriz.

+0

* allocbuf es una matriz estática, en realidad apunta al primer elemento *: una matriz no apunta a nada, es solo que el identificador se descompone en un puntero. –

+0

Gracias. El problema que tengo está en tu primera oración. "allocbuf es una matriz estática ... apunta a ...". Si no es un puntero, ¿cómo puede apuntar? –

1

Mientras que se declaran de diferentes maneras, allocp y allocbuf son ambas matrices char (char *) y allocp apunta efectivamente en la primera char del búfer después de la inicialización, y después de pasar por el cuerpo "if", al la misma dirección + la cantidad de bytes asignados, y este número aumenta con cada nuevo ciclo en el cuerpo "si". En resumen, apunta al primer char libre en el buffer. La línea "si" con la que está atrapado tiene como objetivo verificar si hay espacio suficiente para asignar n caracteres en el allocbuf, el búfer estático. Esta línea podría ser descompuesto de la siguiente manera:

char* static_buffer_beginning = allocbuf; 
char* static_buffer_ending = static_buffer_beginning + MAXLINE; 
int nb_chars_still_available = static_buffer_ending - allocp; 
if (nb_chars_still_available >= n) { 

estoy un poco confundido por la "ALLOCSIZE", que aparece en el código: ¿cuál es su valor, ¿de dónde vienen de ?! Supongo que es un error tipográfico o algo así y que su valor es igual a MAXLINE, pero me gustaría estar seguro de no darle una respuesta incorrecta.

+0

Ignorar MAXLINE. Me ausenté tipeado, cuando me refería a ALLOCBUF. Edité la pregunta. –

+0

Bien. Luego reemplace MAXLINE por ALLOCSIZE, o qué macro usa, y la explicación permanece igual. – psycho

+0

Hmmm, bastante nuevo para stackOverflow, así que no sé cómo comentar una respuesta que no es mía, pero estoy absolutamente en desacuerdo con tu primer comentario sobre la respuesta de @Blagovest Buyukliev. 'char * pntr = allocbuf;' está bien, pero 'char * pntr = & allocbuf;' está equivocado, gcc dará como resultado tipos de puntero incompatibles. – psycho