C中fscanf的分段错误:缓冲区溢出?

C中fscanf的分段错误:缓冲区溢出?,c,segmentation-fault,out-of-memory,C,Segmentation Fault,Out Of Memory,我想读一个有一百万行9列的文件。如果文件最多有200000行,则程序运行良好,否则我会看到以下错误: 分段故障:核心转储 错误退出代码:139 问题是我想读取文件,以便可以读取不同列中的值,因此,我不能使用FGET扫描整行。我找不到解决这个问题的好办法,我能得到一些帮助吗 下面是我的程序快照,省略了y的定义,如下所示: int main(){ int number=290000; int k,u,i,n = 10000; float ns_ux[number], ns_uy[number], n

我想读一个有一百万行9列的文件。如果文件最多有200000行,则程序运行良好,否则我会看到以下错误:

分段故障:核心转储

错误退出代码:139

问题是我想读取文件,以便可以读取不同列中的值,因此,我不能使用FGET扫描整行。我找不到解决这个问题的好办法,我能得到一些帮助吗

下面是我的程序快照,省略了y的定义,如下所示:

int main(){
int number=290000;
int k,u,i,n = 10000;
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number];
float l[number],b[number], ns[number], xf,x0,step,s;

FILE *fp=NULL;
fp=fopen("File_new.txt","w");
printf("Enter x0, xf, no. of subintervals: ");
scanf("%f%f%d",&x0, &xf,&n); 
FILE* val= NULL;

printf("k  xn   yn  zn  int_val     tau  \n");
val=fopen("file.txt", "r");

for(u=0;u<=(number-1);u++){
   fscanf(val,"%f %f %f %f %f %f %f %f %f", &xn[u], &yn[u], &zn[u], &ns_ux[u], &ns_uy[u], &ns_uz[u], &l[u], &b[u], &ns[u]);// \t is tab
            }
    for(k=0;k<=(number-1);k++){
    step = (xf-x0)/n;
    s = y(x0,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k]) + y(xf,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k],l[k], b[k], ns[k]);

    for(i = 1; i < n; i++){
        s += 2*y(x0+i*step,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k] );
        }
      int_val = s*step/2; 
      fprintf(fp,"%f\t%f\t%1.7f\t%f\n",l[k],b[k],fabs(int_val),ns[k]);
}
fclose(fp);

        return 0;
}
堆栈上有290000个元素的数组可能会导致问题。您应该使用malloc在堆上分配内存

注-

一,。您有许多阵列,因此在分配空闲阵列后,可能会导致内存泄漏

二,。在代码中检查fopen和fscanf的返回


三,。为了安全起见,请初始化程序中的数组。

由于这些数组是在堆栈上创建的,您可以尝试执行ulimit-s unlimited,以便设置不受限制的堆栈大小。

您应该按照前面的说明使用malloc并对其进行保护

float *arr;

arr = (float *)malloc(sizeof(float) * 290000)
if (!arr)
{
   printf("error malloc");
   exit(0);
}

别忘了自由

另一个解决方案是定义数字290000和静态浮点ns_ux[number],等等@M.M注意到了这一点,先生。@Phyast10欢迎,干杯!!
  float *ns_ux;
  ns_ux=malloc(sizeof(float)*290000);       // like this for all and check its return
float *arr;

arr = (float *)malloc(sizeof(float) * 290000)
if (!arr)
{
   printf("error malloc");
   exit(0);
}