Удаление элементов массива С

Есть динамический массив, из которого нужно удалить все положительные числа после первого отрицательного. Возникла проблема с удалением элементов, код работает странно.

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

int main()
{
    int n = 10;
    float x, h, a;
    float *r;
    r = (float*)malloc(n * sizeof(float));
    h = 2.2;
    a = 3.2;
    x = 4.1;
    int 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+1; // f - индекс первого положительного элемента
    }

    for (int i = 0; i<n; i++)
    {
        printf("%f ", r[i]);
    }
    int k = n;

    for (int i = f; i < k; i++)
    {
        if (r[i] > 0)
        {
            k--;
            for (int j = i; j<k; j++) r[i] = r[i+1];
            float *tmp = realloc(r, (k) * sizeof(float));
            r = tmp;
        }
    }
}

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

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

Сначала сжимаем массив, потом один раз реаллоцируем

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

if(cnt) {
  float *tmp = realloc(r, (n - cnt) * sizeof(float));
  r = tmp;
}

Ещё не учитывается случай, когда отрицательных значений нет вообще.

→ Ссылка