Прежде всего, вы спрашиваете пользователя о вводе, а затем (просто говоря) используете каталог, в котором существует программа. Я думаю, что вы хотите сделать что-то еще, и это
int i = scandir( userd, &namelist , 0 , alphasort);
Интересно, что произойдет, если кто-то введет данные, размер которых превышает 20
(размер userd
) ;)
AFAIK free(namelist); and free(namelist[j]);
у вас все в порядке, так как у вас есть двойной указатель и malloc()
выполняется внутри scandir()
Но не завершать программу после i<0
немного плохо, поскольку она просто переходит на free(namelist);
что даст undefined behaviour
(на моем компьютере: *** glibc detected *** free(): invalid pointer:
). Вы также можете добавить free()
только в часть else
.
Это код, который, я думаю, вы ищете:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main()
{
char userd[20];
int i,j;
struct dirent ** namelist;
//struct stat statBuf; //Unused
printf("Enter a directory : ",userd);
scanf("%s",userd);
printf("the dir is %s\n",userd);
//Uncomment this if you want the directory from the User Input
//i = scandir( userd, &namelist , 0 , alphasort);
i = scandir( "." , &namelist , 0 , alphasort);
//printf("enter a directory name : ");
printf("scandir returned i=%d\n",i);
if (i < 0)
{
perror("Scandir failed to open directory I hope you understand \n");
return -1;
}
else
{
for( j=0 ; j<i ; j++)
{
printf("j=%d i=%d %s\n",j,i,namelist[j]->d_name);
free(namelist[j]);
}
free(namelist);
}
return 0;
}