1

kk。我需要了解生活。当我将文件指针 fp 传递给一个新函数并在那里打开它时, fclose(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
}

我的解决方案是传递 fp 的地址,这是一个指向 File 的指针。我不明白为什么它会改变事情

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
}

-奥斯汀

4

3 回答 3

3

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

于 2011-12-01T08:00:07.220 回答
2

您没有更改传递的指针,您只是更改了它的本地副本。所以很自然地,在调用者的函数结束时,它看起来好像functionToOpenFile什么也没做。尝试这个:

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

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

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

于 2011-12-01T07:59:38.660 回答
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;
}
于 2011-12-01T08:22:35.137 回答