Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: HRSLASH en 5 Noviembre 2012, 01:51 am



Título: Problema con realloc - c
Publicado por: HRSLASH en 5 Noviembre 2012, 01:51 am
Hola foreros! asi como dice el titulo, estoy teniendo problemas al usar esta funcion, cada vez que ejecuto el programa el sistema lo aborta ya que alega que le estoy pasando un puntero invalido a realloc, he intentado varias cosas pero no hay caso, el error persiste.. Aca el codigo:

Código
  1. char *borrar_espacios(const char *s)
  2. {
  3. char *temp = NULL;
  4. int i;
  5.  
  6. temp = (char *) malloc(sizeof(char));
  7. for (i = 0; *s != '\0'; ++s)
  8. if (!isspace(*s)){
  9. temp = (char *) realloc(temp, sizeof(char));
  10. *temp = *s, ++temp, ++i;
  11. }
  12. *temp = '\n';
  13. return temp - i;
  14. }
  15.  

Gracias de antemano!  :D


Título: Re: Problema con realloc - c
Publicado por: naderST en 5 Noviembre 2012, 02:03 am
Citar
ptr
Pointer to a memory block previously allocated with malloc, calloc or realloc, or a null pointer (to allocate a new block).
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

El problema es que cuando haces ++temp, temp deja de ser un puntero a un bloque reservado con malloc o calloc.

EDIT: No entiendo el uso que le quieres dar a realloc.


Título: Re: Problema con realloc - c
Publicado por: HRSLASH en 5 Noviembre 2012, 02:18 am
La idea era ir copiando caracter por caracter a un nuevo string sin los espacios en blanco e ir reservando memoria a medida que la fuera necesitando pq no se el tamaño del string que toma la funcion como argumento, puede ser variable


Título: Re: Problema con realloc - c
Publicado por: rir3760 en 5 Noviembre 2012, 02:26 am
La idea era ir copiando caracter por caracter a un nuevo string sin los espacios en blanco e ir reservando memoria a medida que la fuera necesitando
No es necesario reservar el bloque de memoria antes de inserción, en su lugar haces una con el tamaño máximo (el peor escenario) y reajustas solo después de leer todos los caracteres. Para obtener el tamaño de la cadena puedes utilizar la función "strlen" (prototipo en <string.h>) o un bucle.

Por ejemplo (sin validación de errores):
Código
  1. #include <string.h>
  2. #include <ctype.h>
  3.  
  4. /* ... */
  5.  
  6. char *borrar_espacios(const char *s)
  7. {
  8.   char *t = malloc(strlen(s) + 1);
  9.   int i;
  10.  
  11.   for (i = 0; *s != '\0' && *s != '\n'; s++)
  12.      if (!isspace(*s))
  13.         t[i++] = *s;
  14.   t[i++] = '\0';
  15.  
  16.   t = realloc(t, i);
  17.  
  18.   return t;
  19. }

Un saludo


Título: Re: Problema con realloc - c
Publicado por: naderST en 5 Noviembre 2012, 02:27 am
Necesitas otro apuntador para que vaya avanzando y si te fijas cuando haces realloc nunca varías el tamaño del bloque. Deberías inicializar i en 1 y pasarle el valor de i a realloc como el nuevo tamaño.

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

EDIT: Puedes optar por lo que te dijo rir3760.
PD: Recuerda que debes liberar la memoria reservada dinámicamente.


Título: Re: Problema con realloc - c
Publicado por: HRSLASH en 5 Noviembre 2012, 02:51 am
naderST y rir3760 muchas gracias por sus respuestas. Finalmente he optado por hacer lo que dijo rir3760.  :D

Saludos!!