文件指针不会在单独的函数中初始化(fclose上的seg fault)

时间:2011-12-01 07:56:59

标签: c file segmentation-fault fclose

KK。我需要了解生活。 当我将fp,一个文件指针传递给一个新函数,并在那里打开它时,fclose(fp)会导致seg错误!我发现文件指针fp从未打开过。

main(int argc, char *argv[])
{
   File *fp;
   //*argv == filename
   functionToOpenFile(fp,*argv);
   //do stuff
   fclose(fp);
}

functionToOpenFile(File *fp, char *filename)
{
   fp = fopen(filename,"w");
   //error handling not shown
}

我的解决方案是传递fp的地址,fp是指向文件指针的指针。我不明白为什么它改变了事情

main(int argc, char *argv[])
{
   File *fp;
   //*argv == filename
   functionToOpenFile(&fp,*argv);
   //do stuff
   fclose(fp);
}

functionToOpenFile(File **fp, char *filename)
{
   *fp = fopen(filename,"w");
   //error handling not shown
}

-AUstin

3 个答案:

答案 0 :(得分:3)

因为您要将指针作为参数发送,这意味着它将在堆栈上创建,因此您在函数范围内无法看到您在函数中所做的更改。因此,当您想要关闭文件时,您实际上是在尝试关闭之前未打开的内容。

答案 1 :(得分:2)

您没有更改传递的指针,您只是更改它的本地副本。因此,在函数的结尾处,调用者看起来好像functionToOpenFile什么都不做。试试这个:

functionToOpenFile(FILE **fp, char *filename)
{
   *fp = fopen(filename,"w");
}

/* ... */
functionToOpenFile(&fp,*argv);

有一个C FAQ描述了这个确切的问题。

答案 2 :(得分:0)

怎么样?
int main(int argc, char *argv[])
{
   FILE *fp;
   //*argv == filename
   fp = functionToOpenFile(argv[1]); // better than argv[0] aka *argv.
   if (fp) {
        //do stuff
        fclose(fp);
   } else {
       // error occurred, but has already been dealt with.
   }
}

FILE * functionToOpenFile(char *filename)
{
   FILE * fp = fopen(filename,"w");
   //error handling not shown
   return fp;
}