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:
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
*(lista_temporal+3)="pepe"
*(lista_temporal+4)="paco"
Después del free
*(lista_temporal+3)= liberado
*(lista_temporal+4)= liberado
Y lo que quiero conseguir es:
*(lista_temporal+3)= "pepe"
*(lista_temporal+4)= liberado
para poder redimensionar después con realloc.
Cómo puedo arreglar esto ?
Gracias