2015-09-07 30 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

相关问题