d_name 与生成核心转储的 cstring 进行比较

d_name comparison with a cstring generating core dump

我在 C++ 中使用 dirent.h 以获取目录中的可用目录和文件,除了可用目录和文件外,它还列出了一个“.”的问题。和 ”..” 为了删除它们,我在打印之前添加了一个 if 语句。 代码如下:

if ((dir = opendir (".")) != NULL) {

    while ((ent = readdir (dir)) != NULL) 
    {

        if( !strcmp( ent->d_name, "." )){
            printf ("%s\n", ent->d_name);
        }   

        closedir (dir);
    }
}
else {
  //could not open directory 
  printf("Error opening directory");
}

它没有给我一个编译错误,但在执行时却给了我 “双重自由或腐败(顶部):0x00000000016d3010 *** 中止(核心转储)” 我该如何解决?

!strcmp 比较是一个错误,但与崩溃无关。那是 由关闭目录然后尝试继续从中读取条目引起的。

在以下程序中,您的错误已被注释掉并得到更正。

#include <dirent.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    DIR * dir = NULL;
    if ((dir = opendir (".")) != NULL) {

        struct dirent * ent = NULL;
        while ((ent = readdir (dir)) != NULL) 
        {

            // if( !strcmp( ent->d_name, "." )){ <-- Bug you have yet to find.
            if( strcmp( ent->d_name, "." )){
                printf ("%s\n", ent->d_name);
            }

            // closedir (dir); <-- The cause of your crash

        }
        closedir (dir);
    }
    else {
      //could not open directory 
      printf("Error opening directory");
    }
    return 0;
}

顺便说一句,这个程序的编写语言是C,而不是C++。