“ realloc():下一个无效大小”是什么意思?

时间:2019-06-17 12:44:25

标签: 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 = (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);
}

2 个答案:

答案 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));

顺便说一句:您应该检查mallocrealloc的结果以及可能报告错误的所有其他功能。

循环for(i = 0 ; !feof(fp) ; ++i)是错误的。 feof不会告诉您您将达到EOF,而只是告诉您在读取操作失败后已经达到。您应该检查fscanf的结果,然后可以使用feofferror来区分EOF,与文件相关的错误或其他错误,例如意外输入。参见Why is “while (!feof(file))” always wrong?