我的代码应该从文件中读取文件名,打开文件名并进行一些计算。这些文件包含数据列。我已经声明了数组来读取数据。当我在读入之前初始化数组时,包含文件名的字符串表现得不稳定。如果删除了初始化,问题就解决了。
不稳定的行为是:首先声明的字符串不会留在内存中。在代码中,如果我先声明d[90]
,则稍后的print语句不会打印先前保存的值。可能是什么原因?
以下是代码:
#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);
}
}
答案 0 :(得分:6)
在您的代码中,使用import java.lang.reflect.ParameterizedType;
public class ParametrizedStuff {
@SuppressWarnings("unchecked")
interface Awesomable<T> {
default Class<T> parameterizedType() {
return (Class<T>) ((ParameterizedType)
this.getClass().getGenericInterfaces()[0])
.getActualTypeArguments()[0];
}
}
static class Beer {};
static class EstrellaGalicia implements Awesomable<Beer> {};
public static void main(String[] args) {
System.out.println("Type is: " + new EstrellaGalicia().parameterizedType());
// --> Type is: ParameterizedStuff$Beer
}
等定义,使用float fd[1000]
循环
for
创建off-by-one error,因此导致undefined behaviour,实际上,您尝试访问已分配的内存。
当for(i=1;i<=1000;i++)
{
fd[i]=0;
fm[i]=0;
td[i]=0;
tm[i]=0;
}
使用基于C
的索引时,您应该使用0
到0
的索引来获取具有(size-1)
元素的数组。
此外,请始终针对size
检查fopen()
的返回值,以确保其成功。如果NULL
失败,使用返回的指针将再次调用UB。