Что означает «realloc (): неверный следующий размер»? - PullRequest
0 голосов
/ 17 июня 2019

Я прочитаю некоторую двойную информацию в файле, но мой код делает ошибку. Это сообщение об ошибке «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 ]

1 голос
/ 17 июня 2019

Этот оператор

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 будет содержать количество введенных двойных чисел.

0 голосов
/ 17 июня 2019

Вам нужно выделить память для текущего числа значений +1 в цикле, но вы фактически выделяете память для 2 двойных значений.

Изменить realloc вызов на

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

Кстати: вы должны проверить результат malloc и realloc и всех других функций, которые могут сообщать об ошибке.

Цикл for(i = 0 ; !feof(fp) ; ++i) неправильный. feof не говорит вам, что вы достигнете EOF, но только, что вы достигли EOF после неудачной операции чтения. Вы должны проверить результат fscanf, и после этого вы можете использовать feof и ferror, чтобы различать EOF, ошибку, связанную с файлом, или другие ошибки, такие как неожиданный ввод. См. Почему «while (! Feof (file))» всегда неверно?

...