【问题标题】:Seg fault on fclose?fclose上的Seg错误?
【发布时间】:2015-04-11 07:16:41
【问题描述】:

我正在尝试读取一个整数文件,其中包含文件中的整数个数作为第一个整数,但是当我在读取文件后尝试关闭文件时,我遇到了段错误。

我读到如果文件指针为空并且您尝试关闭它,它将出现段错误。但是,我在关闭它之前检查它是否为空,它不是空的,它仍然给我一个段错误..

我通过 GDB 运行它,一旦 fclose(fp) 执行,它就会出现段错误。

发生了什么事??

这是我的代码:

            char *mode = "r";
            int numsToRead = 0;
            FILE *fp = fopen(inputFile, mode);

            if (fp == NULL){
                    fprintf(stderr, "Can't open input file!\n");
                    exit(1);
            }

            int *temp;
            int index = 0;
            // Get number of integers (first integer)
            fscanf(fp, "%d", &numsToRead);
            fprintf(stdout, "nums to read: %d\n", numsToRead);

            integers = (int*)malloc(sizeof(int) * numsToRead);
            for(int i = 0; i <= numsToRead; i++){
                    int currInt;
                    if(fscanf(fp, "%d", &currInt) == 1)
                            integers[i] = currInt;
                    else
                            break;
            }
            if(fp != NULL)
            fclose(fp);

【问题讨论】:

  • i &lt;= numsToRead 应该是i &lt; numsToRead
  • 您的integers 声明在哪里?如果没有声明,它将默认为int,而不是int *
  • 不要转换malloc的结果!
  • @CoolGuy 如果我无法转换 malloc 的结果,那么我该如何处理类型为 (void *) 的返回指针以使其可用于整数数组
  • 阅读this

标签: c file-io io scanf


【解决方案1】:
for(int i = 0; i <= numsToRead; i++)
//               ^^

应该是

for(int i = 0; i < numsToRead; i++)
//               ^

【讨论】:

  • @JayB , 显示它的声明和文本文件的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多