Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Explicación código [C]

Estas en el tema de Explicación código [C] en el foro de C/C++ en Foros del Web. Hola, tengo el siguiente código en C Código: #include <stdio.h> #include <stdlib.h> int main(void){ char *ad[5]; int i; char *p; p=(char *)malloc(100); for(i=0; i<100; i++) ...
  #1 (permalink)  
Antiguo 20/08/2008, 03:31
 
Fecha de Ingreso: noviembre-2006
Mensajes: 82
Antigüedad: 17 años, 5 meses
Puntos: 0
Explicación código [C]

Hola,
tengo el siguiente código en C

Código:
#include <stdio.h>
#include <stdlib.h>


int main(void){

   char *ad[5];
   int i;
   char *p;

   p=(char *)malloc(100);

   for(i=0; i<100; i++)
      *(p+i)=0;
   
   for(i=0; i<5; i++)
      ad[i]=p + i* 3;   

   for(i=0; i<5; i++)
      gets(ad[i]);
   
   printf(ad[1]-1);
   free(p);

}

Se ejecuta con la siguiente entrada:
hola
examen
el
struct
array

y el resultado por pantalla es "lexael".
Después de hacer varias trazas, no consigo entender cómo funciona exactamente el segundo bucle for. Sé que en cada iteración hace "p+0", "p+3", "p+6",... y que en el array de punteros se van almacenando las líneas que se escriben por teclado ( ad[0]=hola, ad[1]=examen,...) pero luego no consigo ver cómo sale ese resultado. Si alguien me pudiera dar una breve explicación..
Gracias
  #2 (permalink)  
Antiguo 20/08/2008, 22:20
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Explicación código [C]

Es un interesante ejemplo de apuntadores, empezaré desde el principio para que se entienda mejor y trataré de explicarlo lo mejor que pueda:

Código:
p=(char *)malloc(100);
p pasa a apuntar a un sector de memoria con tamaño de 100 bytes.

Código:
for(i=0; i<100; i++)
      *(p+i)=0;
Se inicializa el sector de memoria a donde apunta p para que todo sea 0, quedando p="\0\0\0..."

Código:
for(i=0; i<5; i++)
      ad[i]=p + i* 3;
ad es un arreglo de apuntadores, lo que hace el for es asignar a cada apuntador de ad una posición de p saltando de 3 en 3, quedando así:
ad[0]=p; // ad[0] es igual que p
ad[1]=p+3; // ad[1] apunta a la tercera posición de la memoria asignada para p
ad[2]=p+6; // ad[2] apunta a la sexta posición de la memoria asignada para p
...

Código:
   for(i=0; i<5; i++)
      gets(ad[i]);
ahora se está obteniendo una cadena para cada apuntador, pero lo que se introduzca será guardado en la memoria que fue asignada para p, saltando de 3 en 3, quedando así:

Código:
primero tenemos que p="\0\0\0..."
ad[0] el usuario introduce "hola" ahora p=="hola\0\0\0..."
ad[1] el usuario introduce "examen" pero ad[1] apunta a la tercera posición de p así que p=="holexamen\0\0\0..."
ad[2] el usuario introduce "el" (ad[2] apunta a p+6) por lo que p=="holexael\0\0\0..."
ad[3] el usuario introduce "struct" (ad[3] == p+9) por lo que p=="holexael\0struct\0\0\0..."
ad[4] el usuario introduce "array" (ad[4] == p+12) por lo que p=="holexael\0strarray\0\0\0..."
por último:

Código:
printf(ad[1]-1);
Se está escribiendo el contenido de p según el apuntador ad[1]-1, ad[1] apunta a la tercera posición de la memoria asignada a p pero al restarle 1 al apuntador éste pasa a apuntar a la segunda posición de la memoria, quedando así:

ad[1]-1=="lexael\0strarray\0\0\0..." como hay un \0 antes de "strarray" solo se escribe "lexael"

puedes probar a introducir todas las palabras mayores de 3 letras y así podrás ver como se forma una palabra a partir de las 3 primeras letras de cada palabra dada, excepto de la primera de la cual se usará solo la tercera letra.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:42.