Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mester en 14 Septiembre 2016, 10:17 am



Título: ¿Por qué sucede lo siguiente con el tratamiento de punteros?
Publicado por: mester en 14 Septiembre 2016, 10:17 am
Perdón por el título tan general que he puesto pero es que no sé cómo expresar lo siguiente.

Tengo la siguiente función:
Código
  1. char *GetJSession (FILE *sf) {
  2.  size_t s = 0;
  3.  char *buf = NULL;
  4.  char *js = (char *) calloc (256, sizeof (char));
  5.  char *str = (char *) js;
  6.  
  7.  while (getline (&buf, &s, sf) > 0) {
  8.    printf ("%s", buf);
  9.    if (strstr (buf, "JSESSIONID=") != NULL) {
  10.      while (*++buf != '=');
  11.      while (*buf != ';') {
  12.        *str = *buf;
  13.        str++, buf++;
  14.        printf ("%c", *str);
  15.      }
  16.    }
  17.  }
  18. ...

Lo que quiero saber es por qué es necesario el uso de str y no puedo hacer esto con la variable js directamente. Anteriores veces he intentado hacer lo siguiente:
Código
  1. *js = *buf;
  2. js++, buf++;

Pero no me ha funcionado, sólo me ha funcionado haciendo que str apuntase a js. ¿Puede alguien explicarme esta necesidad?

Gracias de antemano


Título: Re: ¿Por qué sucede lo siguiente con el tratamiento de punteros?
Publicado por: do-while en 14 Septiembre 2016, 12:43 pm
¡Buenas!

Lo que pasa con js es que la has utilizado para saber en que posición de memoria has reservado el vector de 256 bytes. Si mueves ese puntero le pierdes la pista a ese bloque y a su contenido, ya que no sabrás dónde empezaba, y luego no podrás utilizar free para liberar la memoria, así que por eso utilizas un puntero auxiliar, str, para llenar ese espacio con los datos que correspondan manteniendo en js la posición de memoria en donde empieza el bloque de datos.

Otra alternativa para hacer lo mismo sería utilizar una variable para indicar un desplazamiento sobre el puntero js, y utilizar aritmética de punteros o notación de subíndices:
Código
  1.    char *GetJSession (FILE *sf) {
  2.      size_t s = 0;
  3.      char *buf = NULL;
  4.      char *js = (char *) calloc (256, sizeof (char));
  5.      //char *str = (char *) js;
  6.      int desplazamiento = 0;
  7.  
  8.      while (getline (&buf, &s, sf) > 0) {
  9.        printf ("%s", buf);
  10.        if (strstr (buf, "JSESSIONID=") != NULL) {
  11.          while (*++buf != '=');
  12.          while (*buf != ';') {
  13.            *(js + desplazamiento) = *buf;
  14.            buf++;
  15.            printf ("%c", *(js + (desplazamiento++)));
  16.          }
  17.        }
  18.      }
  19.    ...
  20.  

Y con notación de subíndices quedaría:

Código
  1.    char *GetJSession (FILE *sf) {
  2.      size_t s = 0;
  3.      char *buf = NULL;
  4.      char *js = (char *) calloc (256, sizeof (char));
  5.      //char *str = (char *) js;
  6.      int desplazamiento = 0;
  7.  
  8.      while (getline (&buf, &s, sf) > 0) {
  9.        printf ("%s", buf);
  10.        if (strstr (buf, "JSESSIONID=") != NULL) {
  11.          while (*++buf != '=');
  12.          while (*buf != ';') {
  13.            js[desplazamiento] = *buf;
  14.            buf++;
  15.            printf ("%c", js[desplazamiento++]);
  16.          }
  17.        }
  18.      }
  19.    ...
  20.  

¡Saludos!

Una cosa que he visto. En ningún momento compruebas que estés dentro del límite de 256 bytes que has reservado para js.

Con el puntero auxiliar debería de comprobar que la diferencia con respecto al inicio sea menor que 256: str - js < 256, y con la variable entera con la que mides el desplazamiento deberías de comprobar que ésta tenga también un valor inferior a 256: desplazamiento < 256. Así te aseguras de no estar accediendo a posiciones de memoria en las que puede que no tengas permisos de lectura/escritura (vamos, que el programa podría crashear en tiempo de ejecución con un error de segmentación).