C &引用;要使用的变量未初始化";警告

C &引用;要使用的变量未初始化";警告,c,gcc,initialization,warnings,C,Gcc,Initialization,Warnings,我正在测试的代码提供了当前工作目录中的文件列表 #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

我正在测试的代码提供了当前工作目录中的文件列表

#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;
}
#包括
#包括
#包括
#包括
内部主(空)
{
DIR*dp;
结构方向*ep;
dp=opendir(“./”);
如果(dp!=NULL)
{
while(ep==readdir(dp))
{
放置(ep->d_名称);
(无效)closedir(dp);
}
}
其他的
puts(“无法打开目录”);
返回0;
}
代码可以工作,但是使用GCC编译给了我一个警告,告诉我(我使用西班牙语中的GCC)可能会发生这样的情况:变量
ep
可以在函数中不初始化的情况下使用

我试图给变量
ep
一个valor来避免这个警告(编程的良好实践),但是这样做会导致程序没有做它应该做的事情

知道发生了什么事,或者我做错了什么吗?

你只需要写

while ((ep = readdir(dp)))
因为写入
==
不会给ep分配任何内容

while条件的测试将在表达式ep=readdir(dp)的结果上进行,并计算为ep最终值。

您只需编写

while ((ep = readdir(dp)))
因为写入
==
不会给ep分配任何内容


while条件的测试将在表达式ep=readdir(dp)的结果上进行,计算结果为ep最终值。

您将未初始化变量ep等同于此行中函数的返回值

while (ep == readdir(dp))
你想分配任务吗

while ((ep = readdir(dp)))
如果要读取所有条目,可能需要将
closedir()
移动到
while
循环之外

closedir(dp); //no need to cast

将未初始化变量
ep
与此行中函数的返回值相等

while (ep == readdir(dp))
你想分配任务吗

while ((ep = readdir(dp)))
如果要读取所有条目,可能需要将
closedir()
移动到
while
循环之外

closedir(dp); //no need to cast
实际上,您需要使用
readdir
读取目录,
readdir
返回
struct dirent*
现在将此返回值存储到ep中,需要检查
readdir
是否成功或失败

如果发生错误,则返回NULL并正确设置errno。

您需要检查ep是否为空,但您需要检查ep==readdir(dp)

为了理解清楚,你可以写

     while ( (ep == readdir (dp))  !=NULL) 
实际上,您需要使用
readdir
读取目录,
readdir
返回
struct dirent*
现在将此返回值存储到ep中,需要检查
readdir
是否成功或失败

如果发生错误,则返回NULL并正确设置errno。

您需要检查ep是否为空,但您需要检查ep==readdir(dp)

为了理解清楚,你可以写

     while ( (ep == readdir (dp))  !=NULL) 

在赋值周围使用一对括号以避免另一个警告。在赋值周围使用一对括号以避免另一个警告。它给我另一个警告,建议我在赋值周围使用括号作为真正的值,就在你建议这项改变的那一行。它给了我另一个警告,建议我在分配周围使用括号,作为真正的勇气,就在你建议这项改变的那一行。