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
答案 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;
}