开发者

compilation error

#include<dirent.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
int main ()
{
struct dirent **namelist;
int i,j;
char userd[20];
struct stat statBuf;
printf("Enter a directory %s\n",userd);
scanf("%s",&userd);
printf("the dir is %s\n",*userd);
        i=scandir(".",&namelist,0,alphasort);
        printf("enter a directory name %s",*userd);
        printf("scandir returned i=%d\n",&i);

if (i<0)
perror("Scandir failed to open directory I hope you understand \n");
else
 {
   开发者_开发百科     for(j=0;j<i;j++)
        {
          printf("j=%d i=%d %s\n",j,i,namelist[j]->d_name);
         // lstat
          free(namelist[j]);
        }
 }
free(namelist);
}

Can some one help to understand why am I getting warning in above code?


You have several issues in your code besides the one Tim already found:

printf("Enter a directory %s\n",userd);

uses an uninitialized variable.

printf("the dir is %s\n",*userd);

Even unnecessary dereferences the uninitialized variable.

The code around scandir(".",&namelist,0,alphasort); looks ok (at first sight).


First of all you ask the user for some input, and then (simply speaking) use the directory the program exists. I think you want to do something else and that is

int i = scandir( userd, &namelist , 0 , alphasort);

I wonder what happen if someone enters data bigger than 20 (which is the size of userd) ;)

AFAIK the free(namelist); and free(namelist[j]); you do are alright since you have double pointer and malloc() is done inside the scandir() But not terminating the program after i<0 is a bit bad since it would just jump to free(namelist); which would yield undefined behaviour (In my computer : *** glibc detected *** free(): invalid pointer:). You can as well add the free() only in the else part.

This is the code I think you are looking for :

#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;
}


scanf("%s",&userd); 

Should be

scanf("%s", userd);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜