[C con Clase] Necesito ayuda con esta función que devuelve un array (char **)

Creneo creneo en gmx.com
Lun Abr 30 19:57:07 CEST 2012


Hola Mon,

El error es que liberas la memoria estando aún dentro de la funcion. 
"free(s);"

has de liberar la memoria despues de cargar la función o bien mostrar el 
array antes de liberar la memoria, sino, no tiene sentido que reserves 
la memoria dentro de la función "Split" y antes de salir de ella, sin 
mostrar el contenido de lo que deseas, liberar la memoria dinámica.

Resumiendo, por ejemplo, puedes poner el el bucle de mostrar el array 
que tienes en la funcion principal (main) dentro de la funcion "Split" y 
antes de liberar la memoria (free(s)) o bien liberar la memoria en la 
función principal despues de mostrar el array en la funcion principal.


Espero que te ayude,


Un Saludo


David Marin



On 30/04/2012 18:17, MON wrote:
> Se trata de una función a la que se le envía como argumento una frase 
> y sirviéndome de la función "strtok" debe devolver, en un array (char 
> **), cada una de las palabras que la componen. Sin embargo, se produce 
> un error en los dos primeros elementos del array.
>
> Os transcribo el código (indicando al final el error que se produce)
>
> char **split(const char *palabra)
> {
> char *s   = NULL;
> char *tmp = NULL;
> char **p  = NULL;
> int count = 0;  //contador inicial de elementos del array (char **)
>
> s = (char *)malloc( 1 + strlen(palabra) );
> strcpy(s, palabra);
> tmp = strtok(s, " ");
>
> while( NULL != tmp )
> {
> p = (char **)realloc(p, sizeof(char *) * (count + 1) );  // un nuevo 
> elemento para el array
> p[count] = tmp;   // asigno al elemento la palabra obtenida por "strtok"
> tmp = strtok(NULL, " ");  // llamo a la función
> count++;   // incremento el contador
> }
>
> free(s);
> s = 0;
>
> // el último elemento del array debe ser nulo
> p = (char **)realloc(p, sizeof(char *) * (count + 1) );
> p[count] = '\0';
>
> return p;
> }
>
>
> int main(const int argc, char * argv[])
> {
> // llamamos a la función
> char **p = split("Lo que el viento se llevó");
>
> // recorremos "p" para mostrar cada una de las palabra
> while( *p != NULL )
> {
> printf("%s\n", *p);
> ++p;
> }
> /*
>  ¡LO QUE SALE POR PANTALLA! ¡ERROR!
>  [un espacio vacío en lugar de "Lo"]
>  [otro espacio vacío en lugar de "que"]
>  el
>  viento
>  se
>  llevó
>  */
>
> return 0;
> }
>
>
> Me podéis aclarar dónde falla mi código. ¡Gracias !
>
>
> _______________________________________________
> Lista de correo CconclaseCconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas:http://listas.conclase.net/index.php?gid=2&mnu=FAQ


------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120430/623cd6c9/attachment.html>


Más información sobre la lista de distribución Cconclase