Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
closedir()导致内核转储_C_Core_Closedir - Fatal编程技术网

closedir()导致内核转储

closedir()导致内核转储,c,core,closedir,C,Core,Closedir,我在unix平台上用C编写的代码中有以下几行代码。请告诉我为什么在closedir()函数中转储内核。我可以成功打开路径指定的目录 if (opendir(MyDir) != NULL ) { closedir((DIR *) MyDir); exit 0; } closedir(),而不是char*。希望closedir()did这样做是行不通的。尝试: #include <sys/types.h> #include <dir

我在unix平台上用C编写的代码中有以下几行代码。请告诉我为什么在closedir()函数中转储内核。我可以成功打开路径指定的目录

    if (opendir(MyDir) != NULL )
    {
    closedir((DIR *) MyDir);
        exit 0;
    }
closedir()
,而不是
char*
。希望
closedir()
did这样做是行不通的。尝试:

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

DIR *dir;
if ((dir = opendir(MyDir)) != NULL)
    closedir(dir);
#包括
#包括
DIR*DIR;
如果((dir=opendir(MyDir))!=NULL)
closedir(dir);
另外,您似乎添加了一个强制转换
(DIR*)MyDir
,以抑制编译器警告。当编译器向您发出警告时,您应该找出它发出警告的原因。抑制警告不是正确的做法。

closedir()
,而不是
char*
。希望
closedir()
did这样做是行不通的。尝试:

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

DIR *dir;
if ((dir = opendir(MyDir)) != NULL)
    closedir(dir);
#包括
#包括
DIR*DIR;
如果((dir=opendir(MyDir))!=NULL)
closedir(dir);

另外,您似乎添加了一个强制转换
(DIR*)MyDir
,以抑制编译器警告。当编译器向您发出警告时,您应该找出它发出警告的原因。抑制警告不是正确的做法。

MyDir
必须是
const char*
才能作为
opendir
的参数

您需要
opendir
中的结果才能传递到
closedir
——您不能只是强制转换路径

const char* MyDir = "/";
DIR* directory = opendir(MyDir);
if (directory != NULL)
{
    closedir(directory);
    exit(0);
}

MyDir
必须是
const char*
才能作为
opendir
的参数

您需要
opendir
中的结果才能传递到
closedir
——您不能只是强制转换路径

const char* MyDir = "/";
DIR* directory = opendir(MyDir);
if (directory != NULL)
{
    closedir(directory);
    exit(0);
}

排字不正确。供参考:

opendir
需要一个目录名(char*)作为参数,并返回一个目录流(DIR*):

closedir
需要一个目录流(DIR*)作为参数,并返回一个int(成功时为0):

因此,您的代码应该如下所示:

const char* dirname;
DIR* mydir;

mydir = opendir(dirname);
if(mydir != NULL) {
   closedir(mydir);
   exit(0);
}

另请参见:

类型转换不正确。供参考:

opendir
需要一个目录名(char*)作为参数,并返回一个目录流(DIR*):

closedir
需要一个目录流(DIR*)作为参数,并返回一个int(成功时为0):

因此,您的代码应该如下所示:

const char* dirname;
DIR* mydir;

mydir = opendir(dirname);
if(mydir != NULL) {
   closedir(mydir);
   exit(0);
}

另请参见:

显示更多代码,“MyDir”是如何声明的?这甚至没有编译…显示更多代码,“MyDir”是如何声明的?这甚至不能编译…请不要在if中使用
=
。即使有额外的括号,那也只是坏代码。@Helltone:为什么是坏代码?想解释一下吗?在这种情况下需要额外的括号。(我本来可以写
if(dir=opendir(MyDir))
如果我要写糟糕的代码[按照我的标准,有些人可能会发现它完全可以]。“if”是控制流。“如果”中的赋值被认为是有害的。一般来说,不要将分配放在任何控制结构中。顺便说一句,你的“坏代码示例”(有些人认为不错)会在gcc的最新版本中产生警告。是的,我知道
如果
是什么。你是否也反对((c=getchar())!=EOF)?你说的是个人风格/品味的问题。@Alok,我同意Helton的观点。在您已经声明的while条件中,您只是将getchar()的结果传递给c。这很好,但是=对于比较无效。请不要在if中使用
=
。即使有额外的括号,那也只是坏代码。@Helltone:为什么是坏代码?想解释一下吗?在这种情况下需要额外的括号。(我本来可以写
if(dir=opendir(MyDir))
如果我要写糟糕的代码[按照我的标准,有些人可能会发现它完全可以]。“if”是控制流。“如果”中的赋值被认为是有害的。一般来说,不要将分配放在任何控制结构中。顺便说一句,你的“坏代码示例”(有些人认为不错)会在gcc的最新版本中产生警告。是的,我知道
如果
是什么。你是否也反对((c=getchar())!=EOF)?你说的是个人风格/品味的问题。@Alok,我同意Helton的观点。在您已经声明的while条件中,您只是将getchar()的结果传递给c。这很好,但是=对于比较无效。谢谢道格拉斯,我得到了解决方案,我的代码现在工作正常。谢谢道格拉斯,我得到了解决方案,我的代码现在工作正常。