Esta es una pregunta antigua, pero dado que la encontré y no resolvió mi pregunta de manera tan efectiva como lo hizo la página de manual, estoy copiando un fragmento de código de la página de manual como una nueva respuesta para el futuro.
#include <dirent.h>
int
main(void)
{
struct dirent **namelist;
int n;
n = scandir(".", &namelist, NULL, alphasort);
if (n < 0)
perror("scandir");
else {
while (n--) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}
La función scandir()
asigna la memoria por usted.
No necesita asignar NINGUNA memoria. Tú HACES necesita liberar la memoria que le devolvió scandir()
.
Su código llama:*noOfFiles = scandir(path, &fileListTemp, NULL, alphasort);
A la vuelta, noOfFiles
contendrá el número de entradas de directorio en el path
directorio, y fileListTemp
apuntará a una matriz asignada de punteros a struct dirent asignados blobs, cada uno de los cuales tiene un d_name miembro que apunta al nombre terminado en nulo de un archivo/directorio.
Si su directorio contiene los archivos "FirstFile.txt", "AnotherFile.txt", "ThirdFile.txt", por ejemplo, con su llamada, al regresar de scandir()
, noOfFiles
se establecerá en 5 para los tres archivos más dos más para el "." y ".." entradas de directorio. LAS ENTRADAS NO ESTARÁN EN UN ORDEN EN PARTICULAR SI NO APRUEBA 'alphasort'. (En realidad, eso es un poco incorrecto. Estarán en el orden de las entradas de nombre de archivo del directorio, que depende del orden en que se crearon originalmente los archivos).
Debido a que aprobó 'alphasort', debería ver las entradas en el siguiente orden (estoy mostrando explícitamente el terminador de cadena de bytes nulos:
fileListTemp[0]->d_name == ".\0"
fileListTemp[1]->d_name == "..\0"
fileListTemp[2]->d_name == "AnotherFile.txt\0"
fileListTemp[3]->d_name == "FirstFile.txt\0"
fileListTemp[4]->d_name == "ThirdFile.txt\0"
Entonces fileListTemp apunta a un bloque de memoria asignada que contiene cinco struct dirent punteros Cada una de las cinco dirección de estructura los punteros apuntan a una dirección de estructura bloque de memoria asignada que contiene un nombre de entrada de directorio terminado en nulo en d_name miembro. (Incluso esto es una simplificación, porque la entrada d_name también es un puntero, pero apunta al espacio adicional asignado al final del bloque asignado, y el nombre de la entrada se almacena allí).
Eso es SEIS bloques de memoria asignada.
Puede usar esta memoria asignada hasta que haya terminado con ella, y luego llamar a free() en CADA entrada en la matriz seguida de free() de la propia matriz.
DEBE liberar todas las entradas, así como la propia matriz. Todos son blobs de memoria asignados de forma independiente.
Cuando haya terminado con la lista, debe:
for (int i = 0; i < noOfFiles; i++)
{
free(fileListTemp[i];
}
free(fileListTemp);