Ошибка double free or corruption - fasttop

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    int n, f, k, max_i;
    float x, h, a, sum, average, *r;

    printf("n = ");
    scanf("%d ", &n);

    printf("h = ");
    scanf("%f ", &h);

    printf("a = ");
    scanf("%f ", &a);

    printf("x = ");
    scanf("%f ", &x);

    r = (float*)malloc(n * sizeof(float));

    //1

    f = 0;

    for (int i = 0; i < n; i++)
    {
        r[i] = cos(i*h) - cos(a*x+i*h);
        if (r[i] < 0 && f == 0)
            f = i;
    }

    for (int i = 0; i < n; i++)
        printf("Result №1: %f ", r[i]);

    printf("\n");
    
    //2

    int cnt = 0;

    for (int i = f+1; i < n; i++)
    {
        if (r[i] < 0)
            r[i - cnt] = r[i];
        else
            cnt ++;
    }

    k = n - cnt;
    float *tmp = realloc(r, k * sizeof(float));
    r = tmp;

    for (int i = 0; i < k; i++)
        printf("Result №2: %f ", r[i]);

    printf("\n");

    //3

    max_i = r[0];

    for (int i = 0; i < k; i++)
        if (r[i] > max_i)
            max_i = i;
    

    for (int i = max_i + 1; i < k; i ++)
    {
        sum += r[i];
    }

    average = sum / k;

    printf("Result №3: %f", average);

    free(tmp);
    free(r);
}

Ответы (1 шт):

Автор решения: Harry

Итак, выделили память:

r = (float*)malloc(n * sizeof(float));

Перераспределили -

float *tmp = realloc(r, k * sizeof(float));

Т.е. теперь выделенная память по адресу в tmp, r теперь указывает на нечто невалидное (а может быть, на ну же память, что и была) — важно то, что этим указателем больше пользоваться нельзя. И вы совершенно справедливо без всяких проблем переприсваиваете

r = tmp;

Все верно. Но поясните теперь, зачем вы ДВАЖДЫ освобождаете одну и ту же память?!

free(tmp);
free(r);

О чем, собственно, и получаете сообщение...

→ Ссылка