Ошибка 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);
О чем, собственно, и получаете сообщение...