【问题标题】:Strange fgets() problem奇怪的 fgets() 问题
【发布时间】:2010-09-19 17:41:38
【问题描述】:

在使用 GCC 编译后,我正在尝试在 Windows 7(64 位,如果重要的话)上运行此代码。如果我将 bufsize 声明为 int,则程序会冻结,并且 Windows 会通知我它已停止工作。如果我使用 #define bufsize 123 它工作正常,如果我自己用数字替换 bufsize ,它工作正常。我在这里错过了什么?

int main(int argc, char* argv[]) {

    char* filename = argv[1];

    FILE* problem = fopen(filename, "r");
    if (!problem) {
        printf("File doesn't exist\n");
        exit(1);
    }

    char* line;
    while (fgets(line, bufsize, problem) != NULL) {        
        printf(line);
    }


    return 0;
}

【问题讨论】:

  • 没有人向您指出的最大概念错误是您不需要bufsize 变量。您必须将缓冲区大小传递给fgets,但这通常以sizeof buffer 或其他表达式的形式完成。

标签: c fgets


【解决方案1】:

line 是一个指针,但它没有指向任何地方(或者,更好的是,它还没有被初始化并且它的值是不确定的和不可用的)。一个不指向任何地方的指针并不是非常有用。

分配一些内存并使line 指向该内存。记住在不再需要时释放内存。

line = malloc(200);
if (line == NULL) { /* something went wrong, the pointer is pointing nowhere */ }
/* ... use allocated memory ... */
free(line);

哦...和bufsize 值应该与您分配的字节数相匹配。

还有#include <stdlib.h>,因为malloc()free() 在那里有他们的原型。

【讨论】:

    【解决方案2】:

    你还没有为line指向的缓冲区分配空间。

    你应该这样做:

    line = malloc(bufsize);
    

    并使用以下方法释放它:

    free(line);
    

    【讨论】:

      【解决方案3】:

      bufsize 是您应该分配并传递给fgets 的缓冲区大小。您根本没有分配任何缓冲区,然后您对fgets 撒谎,告诉它您正在传递某个特定大小的缓冲区。无论您使用什么大小或如何将其传递给fgets,都无关紧要 - 只要您不分配任何缓冲区,您的代码就会崩溃或行为不可预测。

      只要缓冲区大小不是很大,可以声明为本地数组,而不是动态分配

      char line[bufsize];
      while (fgets(line, bufsize, problem) != NULL) {        
          printf(line);
      }
      

      【讨论】:

      • 只是想我会提到这个(VLA)适用于C99,OP 已经在使用它(混合代码和声明)。
      【解决方案4】:
      char* line = malloc(bufsize);
      

      【讨论】:

        猜你喜欢
        • 2016-07-15
        • 2016-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 2018-06-26
        • 2011-08-13
        • 2011-08-17
        相关资源
        最近更新 更多