[C con Clase] Problema con puntero a puntero char

Programante programante en gmail.com
Jue Oct 18 23:19:37 CEST 2007


Ariel Romero escribió:
> Hola a todos:
>
> Soy nuevo en C y quiero hacer una funcion que abra un directorio 
> determinado y devuelva la lista de ficheros de primer nivel que existen 
> en él. Esto fue lo que hice:
>
>   

Estás haciendo malloc(1) para reservar espacio para un puntero. Con esto 
reservas un bytes, pero los punteros necesitan 4 u 8.
sizeof(dit->d_name)  no va a darte el resultado que buscas. Usa en su 
lugar strlen(dit->d_name) + 1. En Linux dirent tiene un campo que puedes 
usar para eso.
Tendrás que cambiar dinámicamente el tamaño de filesListFromDirectory 
usando realloc()
Nunca liberas la memoria que reservas.

> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/types.h>
> #include <dirent.h>
> #include <errno.h>
>
>     char** listFilesFromDirectory(char* directory){
>         DIR *dip;
>         struct dirent   *dit;
>         int             i = 0;
>         char** filesListFromDirectory;
>         
>         if ((dip = opendir(directory)) == NULL){
>             perror("opendir");
>             return NULL;
>             }
>         
>         printf("Directory stream is now open\n");
>   
filesListFromDirectory = NULL; //La primera vez realloc() la reservará


>         while ((dit = readdir(dip)) != NULL){
>   
/*Cambiamos el tamaño para que tenga i+1 posiciones*/
filesListFromDirectory = realloc(filesListFromDirectory, sizeof(*filesListFromDirectory)*(i+1));
assert(filesListFromDirectory);

filesListFromDirectory[i]= malloc(strlen(dit->d_name)+1); //Otra opción sería usar strdup() en vez de malloc()+strcpy()

>             strcpy(filesListFromDirectory[i],dit->d_name);
>             i++;            
>             }       
>   
filesListFromDirectory[i]= malloc(char*);

>         //filesListFromDirectory[i]="end";
>   
Escribes  "end" final, pero lo que compruebas luego es que list[var] no 
sea nulo. Por lo tanto lo que tenemos que hacer es

filesListFromDirectory[i]=NULL;


>         int var;
>         
>         if (closedir(dip) == -1){
>             perror("closedir");
>             return 0;
>             }    
>         return filesListFromDirectory;        
>     }
>
> despues en el main para probar y listar los ficheros hago esto:
>
> int main(int argc, char **argv) {
>     char** list; //= malloc(1);
>     list = listFilesFromDirectory("res");
>     int var = 0;
>     while (list[var]!=NULL) {
>         puts(list[var]);
>   
free(list[var]); //Liberar la memoria de ese elemento (suponiendo que no 
miremos más el contenido de la lista).
>         var++;
>     }    
>   
free(list); //Liberar la memoria de la lista
>     return EXIT_SUCCESS;
> }
>
> Pero no sé que sucede que me da error, alguien sabe como hacerlo bien, 
> espero que me pueda ayudar.
> saludos
>   





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