ошибка компиляции - PullRequest
       0

ошибка компиляции

0 голосов
/ 26 декабря 2010
#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);
}

Может ли кто-нибудь помочь понять, почему я получаю предупреждение в приведенном выше коде?

Ответы [ 3 ]

2 голосов
/ 26 декабря 2010

У вас есть несколько проблем в вашем коде, кроме той, которую Тим уже нашел:

printf ("Введите каталог% s \ n", userd);

использует неинициализированную переменную.

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

Даже ненужные разыменовывает неинициализированную переменную.

Код scandir(".",&namelist,0,alphasort); выглядит хорошо (на первый взгляд).

1 голос
/ 26 декабря 2010

Прежде всего, вы спрашиваете пользователя о вводе, а затем (просто говоря) используете каталог, в котором существует программа. Я думаю, что вы хотите сделать что-то еще, и это

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;
}
1 голос
/ 26 декабря 2010
scanf("%s",&userd); 

Должно быть

scanf("%s", userd);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...