0

これはかなりアカデミックだと思いましたが、そうではありません。ディレクトリを(再帰的に)トラバースしようとしています。ただし、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()を2回呼び出さないように、いくつかの場所を読みました。一度呼び出すとセグメンテーション違反が発生します。パス文字列をチェックして、正しいことを確認しました(たとえば、「。」や「./」などを使用)。運が悪いです。

以下のコードは次のとおりです。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()の最初の呼び出し中に発生し、再帰はまったく発生しません。私はオフですか、それともこれはコンパイラ/マシンのものですか?

助けてください!!!!

4

1 に答える 1

2

一つには、 がありますif( currD = NULL)==ではなく、おそらく意味してい=ました。currDうん、それはあなたがNULLである理由を間違いなく説明するでしょう。:-)

ちなみに、NULL == currDこれを防ぐために書くことを好む人もいます。または、単に言うこともできます!currD

于 2012-02-05T05:09:35.553 に答える