【问题标题】:What does "realloc(): invalid next size" mean?“realloc():下一个大小无效”是什么意思?
【发布时间】:2019-06-17 12:44:25
【问题描述】:

我会在文件中读取一些双重信息,但我的代码会出错。 此错误消息是“realloc(): invalid next size”。 如何解决此错误?

如果我减少文件中的读数数量,错误就会消失。为什么我没听懂?

#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);
}

【问题讨论】:

  • 我认为您想为循环中的当前值 +1 数分配内存,但实际上您为 2 个双精度值分配了内存。 real_number = (double *) realloc(real_number,sizeof(double)*(i+1));

标签: c undefined-behavior realloc memory-mapped-files


【解决方案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 将包含输入的双精度数。

【讨论】:

  • 谢谢,因为你,我明白了问题:)
【解决方案2】:

您需要为循环中的当前值 +1 数分配内存,但实际上您为 2 个双精度值分配内存。

realloc 调用更改为

real_number = (double *) realloc(real_number,sizeof(double)*(i+1));

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

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

【讨论】:

  • 非常感谢您的贡献。 :)
猜你喜欢
  • 2020-12-27
  • 1970-01-01
  • 2014-10-13
  • 2015-01-22
  • 1970-01-01
  • 2018-06-11
  • 2016-03-19
相关资源
最近更新 更多