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

[0] Índice de Mensajes

Ir a la versión completa