Segfault调用readdir() - 目录遍历

时间:2012-02-05 05:06:44

标签: c directory readdir

我认为这很有学术意义,但事实并非如此。我正试图遍历目录try(递归)。但是,在调用readdir()时,我一直收到以下消息:

 ./xsed.bin
 make: *** [run] Segmentation fault

通过程序跟踪时,GDB具有以下输出:

Breakpoint 1, recurseDir (path=0x401090 ".") at xsed.c:216
216             DIR *currD = opendir(path);
(gdb) n
217             if( currD = NULL)
(gdb) n
226                     entry = readdir(currD);
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7afef86 in __readdir (dirp=0x0) at ../sysdeps/unix/readdir.c:45
45      ../sysdeps/unix/readdir.c: No such file or directory.
    in ../sysdeps/unix/readdir.c

我已经阅读了几个永远不会在同一个Dir *对象上调用readdir()两次的地方。在调用一次时我得到一个段错误。我检查了路径字符串以确保其正确(例如使用“。”或“./”等) - 没有运气。

以下是以下代码:       称为:recurseDir(getcwd(currD,256))或recurseDir(“。”);

  void recurseDir(char *path)
  {

    DIR *currD = opendir(path);
    if( currD = NULL)
    {
            fprintf(stderr,"Could not open directory: %s\n",path);
            return;
    }
    else
    {
            struct dirent *entry;
            char *dName;
            entry = readdir(currD); <--- segfault

            if( entry == NULL)
            {
                    fprintf(stderr,"Error reading directory.\n");
                    return;
            }

            dName = entry->d_name;
            printf("Current dir:%s\n",dName);

      }
   }

我不知道在readdir()调用中参数(dirp)是如何变为NULL的。注意:这是在第一次调用recurseDir()期间发生的,根本不会发生递归。我是关闭还是这是编译器/机器的事情?

请帮助!!!!

1 个答案:

答案 0 :(得分:2)

首先,你有if( currD = NULL)。你可能意味着==而不是=。是的,这肯定会解释为什么你的currD为NULL。 : - )

顺便说一下,有些人更喜欢写NULL == currD来防范这种情况。或者你可以说!currD