分段故障。为什么?

时间:2017-04-12 20:32:43

标签: c

我正在尝试访问文件并将数据fscanf为2d数组,但每当我运行代码时,我都会遇到Segmentation fault(核心转储)。我试图寻找解释为什么,但似乎无法找到一个。我知道我试图打开的文件位于正确的位置并且拼写错误。有什么帮助吗?

#include <stdio.h>
#include <math.h>
#define FILENAME "rocket1.txt"


int main(void)
{
FILE *rocket1;
int i, NROWS, NCOLS, k, num_data_pts;
double x[NROWS][NCOLS];

rocket1 = fopen(FILENAME,"r");
        if(rocket1 == NULL)
         {printf("Error opening file.\n");}

fscanf(rocket1,"%d",&num_data_pts);

for(i=1;i<=num_data_pts;i++)
    for(k=0;k<4;k++)
        fscanf(rocket1,"%lf",&x[i][k]);



    fclose(rocket1);
return 0;
}

2 个答案:

答案 0 :(得分:1)

要修复您的程序,请尝试以下操作:

#include <stdio.h>
#include <math.h>
#define FILENAME "rocket1.txt"
#define NROWS 10
#define NCOLS 10
int main(void)
{
    FILE *rocket1 = NULL;
    int i, k, num_data_pts;
    double x[NROWS][NCOLS];
    rocket1 = fopen(FILENAME, "r");
    if (rocket1 == NULL)
    {
        printf("Error opening file.\n");
    }
    else
    {
        fscanf(rocket1, "%d", &num_data_pts);
        if ( NROWS <= num_data_pts || NCOLS < 4 )
        {
            printf("Post Fence Error. Increase Array Size.\n");
        }
        else
        {
            for (i = 1; i <= num_data_pts; i++)
                for (k = 0; k < 4; k++)
                    fscanf(rocket1, "%lf", &x[i][k]);
            fclose(rocket1);
        }
    }
    return 0;
}

这里为了演示目的,NROWS和NCOLS被视为10。 在您的代码中,您从索引1(非0)访问i和i的x [i] [k] 扩展到num_data_pts(包括)。因此,包括额外的检查 防止在数组大小之外访问。

答案 1 :(得分:0)

这里有两个主要问题:

  1. 您正在声明NROWS和NCOLS,但没有初始化它们。

    int NROWS, NCOLS;
    
  2. 简单地为2个整数分配内存。他们的初始价值怎么样?您需要分配合适的值,否则它们可能包含垃圾数据。 类似的东西:

        int NROWS = 10, NCOLS = 10;
    

    是可取的。

    1. 您正在尝试打开文件“rocket1.txt”。这段代码有问题:

      rocket1 = fopen(FILENAME,"r");
      if(rocket1 == NULL)
       {printf("Error opening file.\n");}
      
    2. 如果rocket1为NULL,那么你确实打印了一个错误,但是你通常应该终止该程序。

          rocket1 = fopen(FILENAME,"r");
          if(rocket1 == NULL) {
             printf("Error opening file.\n");
             exit(1);
          }
      

      退出程序很重要,因为如果rocket1 = NULL,那么对rocket1的任何后续引用都可能导致NULL指针deference,这将导致段错误。

      希望这有帮助!