我将读取文件中的一些重复信息,但是我的代码出错。 此错误消息是“ realloc():无效的下一个大小”。 如何解决此错误?
如果我减少文件中的读数数量,该错误将消失。为什么我不明白?
#include <stdio.h>
#include <stdlib.h>
#define p1 0.5
#define p2 20
int main(void){
FILE *fp;
int i,j;
double *real_number;
double *temp;
real_number = (double *) malloc(sizeof(double) * 1);
fp = fopen("input.txt","r");
for(i = 0 ; !feof(fp) ; ++i)
{
real_number = (double *) realloc(real_number,sizeof(double)*2);
fscanf(fp,"%lf",&(real_number[i]));
printf("%.2f \n",real_number[i] );
printf("i:%d\n",i );
}
return (0);
}
答案 0 :(得分:1)
此声明
real_number = (double *) realloc(real_number,sizeof(double)*2);
总是分配相同大小的内存,该内存仅用于两次双打。
所以这个循环
for(i = 0 ; !feof(fp) ; ++i)
当i
大于1
时可以调用未定义的行为。
另外循环中的条件也不正确,因为文件的结尾可能出现在该语句中
fscanf(fp,"%lf",&(real_number[i]));
且未选中。
例如,循环可以通过以下方式查看
double *real_number = NULL;
double value;
size_t i = 0;
for ( ; fscanf( fp, "%lf", &value ) == 1; i++ )
{
double *tmp = realloc( real_number, ( i + 1 ) * sizeof( double ) );
if ( tmp == NULL ) break;
real_number = tmp;
real_number[i] = value;
}
在这种情况下,循环后变量i
将包含输入的双精度数。
答案 1 :(得分:0)
您需要为循环中的当前值+1分配内存,但实际上您为2个双精度值分配了内存。
将realloc
呼叫更改为
real_number = (double *) realloc(real_number,sizeof(double)*(i+1));
顺便说一句:您应该检查malloc
和realloc
的结果以及可能报告错误的所有其他功能。
循环for(i = 0 ; !feof(fp) ; ++i)
是错误的。 feof
不会告诉您您将达到EOF,而只是告诉您在读取操作失败后已经达到。您应该检查fscanf
的结果,然后可以使用feof
和ferror
来区分EOF,与文件相关的错误或其他错误,例如意外输入。参见Why is “while (!feof(file))” always wrong?