“要使用的变量未初始化”警告

时间:2013-10-21 12:36:54

标签: 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 (ep == readdir (dp))
        {
            puts (ep->d_name);
            (void) closedir (dp);
        }
    }
    else
        puts ("Couldn't open the directory.");
    return 0;
}

代码可以正常工作,但是GCC的编译给了我一个警告,告诉我(我使用西班牙语的GCC)可能会发生变量ep而无需在函数中初始化

我试图给变量ep一个勇气,以避免这种警告(编程的良好做法),但这样做会导致程序没有做它应该做的事情。

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

3 个答案:

答案 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) 
相关问题