elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Por qué sucede lo siguiente con el tratamiento de punteros?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Por qué sucede lo siguiente con el tratamiento de punteros?  (Leído 1,692 veces)
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
¿Por qué sucede lo siguiente con el tratamiento de punteros?
« 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


En línea

Justicia es dar a cada uno lo que se merece
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: ¿Por qué sucede lo siguiente con el tratamiento de punteros?
« Respuesta #1 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).


« Última modificación: 14 Septiembre 2016, 16:00 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
tratamiento de errores en VB
Programación Visual Basic
^kazike^ 1 1,400 Último mensaje 24 Enero 2008, 15:19 pm
por Hans el Topo
tratamiento de cadenas
Programación Visual Basic
inproboj 1 1,947 Último mensaje 13 Mayo 2010, 20:26 pm
por inproboj
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 5,167 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
Tratamiento de dos tablas a la vez
Programación C/C++
muymuyperdido 8 4,006 Último mensaje 1 Enero 2013, 13:01 pm
por muymuyperdido
Punteros dobles / Punteros a puntero.
Programación C/C++
NOB2014 5 8,413 Último mensaje 13 Abril 2016, 16:00 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines