“realloc():无效的下一个大小”是什么意思?
我将在文件中读取一些双重信息,但我的代码出错。 此错误消息为realloc:下一个大小无效。 如何修复此错误 如果我减少文件中的读数,错误就会消失。为什么我不明白“realloc():无效的下一个大小”是什么意思?,c,undefined-behavior,realloc,memory-mapped-files,C,Undefined Behavior,Realloc,Memory Mapped Files,我将在文件中读取一些双重信息,但我的代码出错。 此错误消息为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 =
#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);
}
此声明
real_number = (double *) realloc(real_number,sizeof(double)*2);
fscanf(fp,"%lf",&(real_number[i]));
始终分配一个大小相同的内存,该内存只能用于两个双精度内存
所以这个循环
for(i = 0 ; !feof(fp) ; ++i)
当i大于1时,可以调用未定义的行为
此外,循环中的条件不正确,因为此语句中可能出现文件结尾
real_number = (double *) realloc(real_number,sizeof(double)*2);
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分配内存,但实际上为2个双倍值分配内存 将realloc调用更改为 顺便说一句:您应该检查malloc和realloc的结果,以及可能报告错误的所有其他函数
i=0;的循环!feoffp++我错了。feof不会告诉您将达到EOF,而只是告诉您在读取操作失败后已达到EOF。您应该检查fscanf的结果,然后可以使用feof和ferror来区分EOF、与文件相关的错误或其他错误,如意外输入。请参见我认为您希望为循环中当前数量的值+1分配内存,但实际上您为2个双值分配内存。实数=双倍*reallocreal\u数,大小为双倍*i+1;谢谢,因为你们,我理解了这个问题:非常感谢你们的贡献