簡體   English   中英

C中的fscanf出現分段錯誤:緩沖區溢出?

[英]Segmentation fault with fscanf in C : buffer overflow?

我想讀取一個具有9列的“一百萬”行的文件。 如果文件的最大行數為200,000,則該程序運行良好,否則會出現以下錯誤:

分段錯誤:核心已轉儲

錯誤退出代碼:139

問題是我想讀取文件以便可以讀取不同列中的值,因此,我不能使用“ fgets”來掃描整個行。 我找不到解決此問題的好方法,是否可以對此提供幫助?

這是我的程序的快照(省略了“ 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;
}
int number=290000;
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number];

堆棧上具有290000元素的數組可能會導致問題。 您應該使用malloc在堆上分配內存。

  float *ns_ux;
  ns_ux=malloc(sizeof(float)*290000);       // like this for all and check its return

注意-

1.您有許多數組,因此在free每個數組之后,否則可能導致內存泄漏。

2.在代碼中檢查fopenfscanf返回。

3.安全初始化s在你的程序。

由於這些數組是在堆棧上創建的,因此您可以嘗試執行ulimit -s unlimited以設置“無限”堆棧大小

您應該像之前所說的那樣使用malloc並對其進行保護。

float *arr;

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

不要忘記免費!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM