我正在测试的这段代码为我提供了当前工作目录中的文件列表。
#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的编译给了我一个警告,告诉我(我使用西班牙语的GCC)可能会发生变量ep
而无需在函数中初始化。
我试图给变量ep
一个勇气,以避免这种警告(编程的良好做法),但这样做会导致程序没有做它应该做的事情。
知道发生了什么,或者我做错了什么?
答案 0 :(得分:4)
您将未初始化的变量ep
等同于返回此行中函数的值
while (ep == readdir(dp))
您想要分配
while ((ep = readdir(dp)))
如果您想阅读所有条目,可能需要在closedir()
循环之外移动while
closedir(dp); //no need to cast
答案 1 :(得分:1)
你只需要写
while ((ep = readdir(dp)))
因为写==
不会给ep分配任何内容。
while条件的测试将在表达式ep = readdir(dp)
的结果上进行,并计算为ep最终值。
答案 2 :(得分: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)