[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