【问题标题】:Return pointer from function C从函数 C 返回指针
【发布时间】:2010-12-25 20:30:23
【问题描述】:

在我的 C 程序中,这个函数将处理打开特定文件的所有工作,然后返回文件指针,因此 main 或其他函数可以使用 fp 读取内容,但到目前为止我还不能让它发挥作用。

我只是在学习语言,所以我可能做错了什么。

int open_text_file(char text_file_name[])
{
    FILE *fp;

    if((fp = fopen(text_file_name, "r")) != 0)
    {
            return fp;
    }

    else
    {
            printf("Cannot open file \"%s\"\n", text_file_name);
    }
}

【问题讨论】:

  • 您正试图将指向FILE 结构的指针作为int 返回。你看到了什么(除了那个错误)?
  • 作为编码风格问题,您应该将fpNULL 进行比较,而不是0。如果将fp 的赋值和比较分离到单独的语句中也可能更清楚。

标签: c pointers function


【解决方案1】:

在第一行,你有

int open_text_file(char text_file_name[])

这将返回类型声明为int 你应该拥有的是

FILE * open_text_file(char text_file_name[])

同样,在你的“其他”情况下,你应该返回一些东西来表明 给调用者一个错误。

return NULL

是一个合适的选择。不过,请确保在调用时检查返回值。

【讨论】:

  • 完美,现在我可以将 argv[1] 传递给函数并从 main 打印内容。正如你们许多人所说,我应该将 fp 与 NULL 进行比较,为什么呢?
  • 在一些不常见的平台上,NULL 可能不是 0。然而,在 C++ 中,或者在实践中的大多数地方,这不是真的。
【解决方案2】:

这个函数有点无意义,因为它所做的只是 fopen() 所做的,加上错误消息。这不是好的设计,因为错误分支还必须返回一个(可能为 NULL)指针,然后必须在调用代码中再次对其进行测试。最好简单地说:

FILE * fp = fopen( somefile, "r" );
if ( fp == NULL ) {
   fprintf( stderr, "Cannot open %s\n", somefile );
   exit(1);   // or whatever you need to do to handle the error
}

【讨论】:

    【解决方案3】:

    FILE* open_text_file(); 需要是原型。

    int 不是 FILE*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2011-12-06
      • 2012-02-26
      • 2020-04-29
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多