Problema con realloc - c

Iniciado por HRSLASH, 5 Noviembre 2012, 01:51 AM

0 Miembros y 1 Visitante están viendo este tema.

HRSLASH

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:


char *borrar_espacios(const char *s)
{
char *temp = NULL;
int i;

temp = (char *) malloc(sizeof(char));
for (i = 0; *s != '\0'; ++s)
if (!isspace(*s)){
temp = (char *) realloc(temp, sizeof(char));
*temp = *s, ++temp, ++i;
}
*temp = '\n';
return temp - i;
}


Gracias de antemano!  :D
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer

naderST

#1
Citarptr
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.

HRSLASH

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
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer

rir3760

Cita de: HRSLASH en  5 Noviembre 2012, 02:18 AMLa 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):
#include <string.h>
#include <ctype.h>

/* ... */

char *borrar_espacios(const char *s)
{
   char *t = malloc(strlen(s) + 1);
   int i;
   
   for (i = 0; *s != '\0' && *s != '\n'; s++)
      if (!isspace(*s))
         t[i++] = *s;
   t[i++] = '\0';
   
   t = realloc(t, i);
   
   return t;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

naderST

#4
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.

HRSLASH

naderST y rir3760 muchas gracias por sus respuestas. Finalmente he optado por hacer lo que dijo rir3760.  :D

Saludos!!
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer