2015-09-07 19 views
2

我有代碼應該從文件讀取文件名,打開它們並做一些計算。這些文件包含數據列。我已經聲明瞭數組讀取數據。當我在讀入之前初始化數組時,包含文件名的字符串以不穩定的方式運行。如果刪除了初始化,問題就解決了。一個字符串突然在函數內部丟失它的值

不穩定的行爲是:首先聲明的字符串不在內存中。在代碼中,如果我先聲明d[90],則以後的打印語句不會打印先前保存的值。可能是什麼原因?

下面是代碼:

#include<stdio.h> 
#include<math.h> 

main() 
{ 

    FILE *data,*model,*filenames; 

    int i,imax,j,k,l; 
    float fd[1000],fm[1000],td[1000],tm[1000]; 
    float a; 
    char d[90],m[90]; 


    k=1; 
    l=0; 

    filenames=fopen("filenames.dat","r"); 


    while(fscanf(filenames,"%s %s",d,m)!=EOF) 
    { 
printf("model: %s\ndata: %s\n",m,d); 

    for(i=1;i<=1000;i++) 
     { 
     fd[i]=0; 
     fm[i]=0; 
     td[i]=0; 
     tm[i]=0; 
     } 


printf("datafile name: %s\n",d); 
printf("modelfile name: %s\n",m); 

    data=fopen(d,"r"); 

    for(i=1;i<=1000;i++) 
     if(fscanf(data,"%f %f %f %f",&td[i],&fd[i],&a,&a)!=EOF) 
     k++; 
     else 
     break; 

    fclose(data); 

printf("modelfile name: %s\n",m); 
    model=fopen(m,"r"); 

    for(i=1;i<=1000;i++) 
     if(fscanf(model,"%f %f %f %f %f %f",&tm[i],&fm[i],&a,&a,&a,&a)!=EOF) 
     l++; 
     else 
     break; 

    fclose(model); 


    } 

} 
+3

'main()' - >'int main(void)' –

+0

這沒有幫助。問題依然存在。 – Sup

+3

這只是一個評論,而不是一個答案。 :) –

回答

6

在代碼中,有像float fd[1000]等的定義,使用for圈狀

for(i=1;i<=1000;i++) 
     { 
     fd[i]=0; 
     fm[i]=0; 
     td[i]=0; 
     tm[i]=0; 
     } 

創建off-by-one error,從而導致undefined behaviour,本質上是,你正試圖訪問分配的內存。

作爲C使用0基於索引,你應該使用索引從0(size-1)用於與size元素的數組。

此外,總是檢查返回值fopen()NULL,以確保它的成功。如果fopen()失敗,則使用返回的指針將再次調用UB。

+0

@Sup請看我更新的答案。並回答後面的部分。一旦程序顯示UB,它的行爲可能完全不穩定。什麼都不能保證。 –

+0

謝謝@Sourav Ghosh! – Sup

+0

我認爲最好的做法是定義大小並在循環中使用for(int i = 0; i Altoyyr

相關問題