【问题标题】:Segmentation Fault (Core dumped) - where is the error?分段错误(核心转储) - 错误在哪里?
【发布时间】:2014-03-31 13:48:35
【问题描述】:

我有一个基本的 C 程序,我必须为个人软件流程作业执行该程序。我对C相当陌生,所以老实说,我看不出哪里出错了。请通读并告诉我我在做什么导致它崩溃?

我必须读入一个文件,并将值存储为一个数组。它没有编译错误,只是一个分段错误。

#include <stdio.h>
#define array_limit   100

int main (void)

{  
  FILE *ifp;
  char *mode = "r";
  ifp = fopen("samplepopulation.txt", mode);  


  if (ifp==NULL)
  {
    printf("cannot read file \n");
  }  
  else
  {   
    int i;
    float sample; 

    float values[array_limit];
    i = 0;

    do
    {
       fscanf(ifp, "%f", &sample);
       if (!feof(ifp))
       {
          values[i] = sample;
          printf("%f \n", values[i]);
          i++;
            if (i>array_limit)
            {
               printf("File larger than allowed/n");
               break;
            }
       }

       else
       {
          printf("read complete");
       }

    } while (ifp!= EOF);     
  }

  fclose(ifp);

  return 0;
}

【问题讨论】:

  • 你已经用 C 标签标记了这篇文章,但你没有在代码的开头声明变量。照顾这种事情......
  • @adripanico 这在 C 语言中非常好。欢迎来到 1999 年。
  • if(i &gt; array_limit)更改为if(i &gt;= array_limit)
  • values 的元素为 0 到 99,因此会在索引为 100 时崩溃
  • @Lundin 编译器完全没问题。 C 规范从未允许这样做。

标签: c segmentation-fault coredump


【解决方案1】:

改变

while (ifp!= EOF);  

while (!feof(ifp)); 

也像这样从文件中扫描:

if (fscanf(ifp, "%f", &sample)==EOF) //EOF if input failure
   break;

【讨论】:

  • 另外,检查 fscanf 的结果,看是否为 EOF。代码似乎混淆了何时使用 feof() 以及何时检查 EOF。
  • 如果读取失败并出现错误怎么办?在那种情况下 feof 永远不会是真的,因此它将是无限循环。
  • "如果在第一次转换(如果有)完成之前发生输入失败,则 fscanf 函数返回宏 EOF 的值。否则,该函数返回分配的输入项数,可以是在早期匹配失败的情况下,少于规定的数量,甚至为零。”
  • while(!feof(ifp)) 完全错误,this has been explained over, and over, and over
  • @RikayanBandyopadhyay:EOF 不是错误,ferror 根本没有处理。如果确实存在读取错误,那么检查feof 将无济于事。此外,我认为这里的问题很可能是fclose(possible_null_ptr);
【解决方案2】:

您可能想更改此设置

fclose(ifp);

成为

if (NULL != ifp)
{
  fclose(ifp);
}

或者直接进入 else 分支:

    ...

    fclose(ifp)
  }

  return 0;
}

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2012-11-19
    • 1970-01-01
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多