1

私がテストしているこのコードは、現在の作業ディレクトリにあるファイルのリストを提供します。

#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int main (void)
{
    DIR *dp;
    struct dirent *ep;
    dp = opendir ("./");
    if (dp != NULL)
    {
        while (ep == readdir (dp))
        {
            puts (ep->d_name);
            (void) closedir (dp);
        }
    }
    else
        puts ("Couldn't open the directory.");
    return 0;
}

コードは機能しますが、GCC でコンパイルすると、関数で初期化せずに変数epが使用される可能性があるという警告が表示されます (私はスペイン語で GCC を使用します) 。

この警告を回避するために変数に勇気を与えようとしましたがep(プログラミングの良い習慣です)、そうすると、プログラムは本来の動作をしなくなります。

何が起こっているのか、または何が間違っているのか分かりますか?

4

3 に答える 3

1
  puts (ep->d_name); //you are tried access uninitialized pointer

実際にはreaddir、を使用してディレクトリを読み取る必要があります。readdir戻りstruct dirent * 値を ep に格納し、readdir成功か失敗かを確認する必要があります。

If an error occurs, NULL is returned and errno is set appropriately.

ep が NULL であるかどうかを確認する必要がありますが、確認していますep == readdir(dp)

  while (ep == readdir (dp)) ==> while (ep = readdir (dp))  
            ^^                             ^  

明確な理解のために、あなたは書くことができます

     while ( (ep == readdir (dp))  !=NULL) 
于 2013-10-21T12:45:22.673 に答える
1

あなたはただ書く必要があります

while ((ep = readdir(dp)))

書き込み==は ep に何も割り当てないためです。

while 条件のテストは、ep = readdir(dp)ep 最終値に評価された式 の結果に対して行われます。

于 2013-10-21T12:38:12.993 に答える