Programación General > C/C++
Problema redimensionando array de strings
(1/1)
krnl64:
Hola a todos.
Estoy intentando hacer una función que recibe un array de strings y dentro copia ese array a uno temporal y lo redimensiono a n-1 para luego seguir
trabajando con él.
Pero no me lo hace bien. Les pongo el code y les comento:
--- Código: C --- void redimlista(char **lista_palabras,const int longitud_lista){char **lista_temporal;int i;int num;int longitud_lista_temporal;char palabra[8]; /* Pido memoria para almacenar los punteros a cadena */ lista_temporal=(char**)calloc(longitud_lista,sizeof(char*)); /* Voy a copiar toda la lista de palabras al array temporal */ for(i=0;i<longitud_lista;i++) { /* Reservo memoria para almacenar la cadena 8 porque 8 es la longitud máxima de las palabras */ *(lista_temporal+i)=(char*)calloc(8,sizeof(char)); /*Copio la cadena */ strcpy(*(lista_temporal+i),*(lista_palabras+i)); } /* Guardo la longitud del array de palabras */ longitud_lista_temporal=longitud_lista; /* Elijo una palabra aleatoriamente de la lista de palabras */ num=rand()%longitud_lista_temporal; /* Copio la palabra elegida */ strcpy(palabra,*(lista_temporal+num)); /* Adelanto todos los elementos un lugar */ for(i=num;i<longitud_lista_temporal-1;i++) *(lista_temporal+i)=*(lista_temporal+i+1); /* Linea problematica */ free(*(lista_temporal+i)); longitud_lista_temporal--; lista_temporal=(char**)realloc(lista_temporal,longitud_lista_temporal*sizeof(char*)); /* .... mas codigo... */ }
El código de la línea 37 es el que me da problemas.
Por ejemplo,si a la función le paso un array de 5 palabras al hacer el free, me libera la memoria de los elementos 4 y 5 en vez de solo el 5º.
Es decir:
Antes del free
--- Código: C --- *(lista_temporal+3)="pepe"*(lista_temporal+4)="paco"
Después del free
--- Código: C --- *(lista_temporal+3)= liberado*(lista_temporal+4)= liberado
Y lo que quiero conseguir es:
--- Código: C --- *(lista_temporal+3)= "pepe"*(lista_temporal+4)= liberado para poder redimensionar después con realloc.
Cómo puedo arreglar esto ?
Gracias
krnl64:
No se si estoy en lo cierto, pero creo que la linea 37 me sobra porque realloc ya libera esa memoria.
Pueden confirmarme si estoy en lo cierto ?
Gracias
m0skit0:
--- Cita de: "krnl64" ---No se si estoy en lo cierto, pero creo que la linea 37 me sobra porque realloc ya libera esa memoria.
--- Fin de la cita ---
Estás en lo cierto a medias :D Sólo debes liberar el último puntero devuelto por realloc().
http://www.manpagez.com/man/3/realloc/
Aunque yo no veo que uses realloc() :lol: ...
Saludos
krnl64:
Elimino la linea 37 y entonces se ejecuta
--- Código: C --- lista_temporal=(char**)realloc(lista_temporal,longitud_lista_temporal*sizeof(char*)); Basta con eso ?
Gracias
m0skit0:
--- Cita de: "krnl64" ---Basta con eso ?
--- Fin de la cita ---
Bueno, el free() lo haces a lista_temporal+i y el realloc() asigna a lista_temporal...
--- Cita de: "m0skit0" ---Aunque yo no veo que uses realloc() :lol: ...
--- Fin de la cita ---
Vale, soy gilipollas... <_<
Navegación
Ir a la versión completa