C 分段故障(堆芯转储)-错误在哪里?

C 分段故障(堆芯转储)-错误在哪里?,c,segmentation-fault,coredump,C,Segmentation Fault,Coredump,我有一个基本的C程序,我必须为个人软件过程任务做。我对C相当陌生,所以我真的看不出哪里出了问题。请通读一遍,让我知道我在做什么导致它崩溃 我必须读入一个文件,并将值存储为数组。它没有编译错误,只是一个分段错误 #include <stdio.h> #define array_limit 100 int main (void) { FILE *ifp; char *mode = "r"; ifp = fopen("samplepopulation.txt", m

我有一个基本的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;
}
#包括
#定义数组\u限制100
内部主(空)
{  
文件*ifp;
char*mode=“r”;
ifp=fopen(“samplepopulation.txt”,模式);
如果(ifp==NULL)
{
printf(“无法读取文件\n”);
}  
其他的
{   
int i;
浮样;
浮点值[数组_限制];
i=0;
做
{
fscanf(ifp、%f、&sample);
如果(!feof(ifp))
{
值[i]=样本;
printf(“%f\n”,值[i]);
i++;
如果(i>数组\u限制)
{
printf(“大于允许值的文件/n”);
打破
}
}
其他的
{
printf(“阅读完整”);
}
}while(ifp!=EOF);
}
fclose(ifp);
返回0;
}
更改

while (ifp!= EOF);  

也可以像这样从文件中扫描:

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

你可能想改变这个

fclose(ifp);
成为

if (NULL != ifp)
{
  fclose(ifp);
}
或者直接进入else分支:

    ...

    fclose(ifp)
  }

  return 0;
}

您已经用C标记了这篇文章,但是您没有在代码的开头声明变量。注意这类事情…@adripanico这在C中非常好。欢迎来到1999年。将
if(i>array\u limit)
更改为
if(i>=array\u limit)
值具有0到99个元素,因此将随索引崩溃100@Lundin这对编译器来说非常好。C规范从来没有允许过。另外,检查fscanf的结果,看看它是否是EOF。代码似乎混淆了何时使用feof()以及何时检查EOF。如果ferror读取失败怎么办?在这种情况下,feof永远不会为真,因此它将是无限循环。”如果在第一次转换(如果有)之前发生输入故障,fscanf函数将返回宏EOF的值已完成。否则,该函数将返回分配的输入项的数量,如果早期匹配失败,该数量可能会少于提供的数量,甚至为零。”
而(!feof(ifp))
完全是错误的,@RikayanBandyopadhyay:
EOF
不是错误,
ferror
根本不处理。如果确实存在读取错误,那么检查
feof
将毫无用处。此外,我认为这里的问题很可能是
fclose(可能为空\u ptr)
    ...

    fclose(ifp)
  }

  return 0;
}