“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 =

我将在文件中读取一些双重信息,但我的代码出错。 此错误消息为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);
}
此声明

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;谢谢,因为你们,我理解了这个问题:非常感谢你们的贡献