我对这段代码有疑问:
FILE * parziale = fopen(" media1"," w");
complex z;
char * strings = calloc(__MAX_LEN__, sizeof(char));
k=0;
i=0;
z.re=0;
z.im=0;
int *nhit_s=calloc(nsrc+1,sizeof(int));
nhit_s[nsrc]= const;
for(;feof(prova)==0;){
strings = fgets(strings, __MAX_LEN__, prova);
if(cancelletto(strings)&&(strings != NULL)){
do{
strings = fgets(strings, __MAX_LEN__, prova);
// fprintf(parziale,"%d\t%s\n",i,strings);
z.re+=readCompl(strings).re;
z.im+=readCompl(strings).im;
i++;
}while( i % nhit_s[nsrc] != 0);
i=0;
z.re /= nhit_s[nsrc];
z.im /= nhit_s[nsrc];
// printf("%d\n",k);
fprintf(parziale,"%d\t%lf\t%lf\n",k,z.re,z.im);
z.re=0;
z.im=0;
k++;
}
}
循环应该读取" prova"指向的FILE的行,如果行以#开头,它进入第二个循环,它对第一个和第二个#之间的行进行求和,然后它保存结果在" parziale"指向的另一个文件上。函数readCompl(strings)定义如下:
复杂的readCompl(char * str){
int n, m;
complex z;
sscanf(str,"%d\t%d\t%lf\t%lf", &n, &m, &(z.re), &(z.im));
return z;
}
问题是在经过一定次数的迭代之后我得到了一个我检查过的分段错误来自函数readCompl(字符串),我不知道为什么因为函数只是从" prova"并且不应该有任何问题。有没有人知道为什么我会出现这种分段错误?
答案 0 :(得分:3)
使用feof()
是一个坏主意,因为它可以返回零,然后下一行输入可能会遇到文件的结尾 - 这会导致意外错误
如果发生错误,fgets()
也会返回NULL
,包括遇到文件结束。
想象一下你的循环一直很愉快,并且刚读完文件中的倒数第二行。在下一次迭代中,feof()
将返回零,因此第一个语句strings = fgets(strings, __MAXLEN__, prova)
将成功。第二个 - 在do-while
循环内 - 将strings
设置为NULL
,因此会将NULL
传递给您的readCompl()
函数 - 这将依次,尝试使用NULL
阅读sscanf()
。如果给定sscanf()
,NULL
会给出未定义的行为 - (其中一个症状可能是分段违规 - 程序访问内存不应该这样)。
解决方案需要分为两部分。首先,不要使用feof()
来控制任何循环。其次,检查您调用的函数的结果(fgets()
,sscanf()
等) - 如果需要 - 使用它们的返回值来控制循环。