Неожиданное поведение realloc () - PullRequest
0 голосов
/ 07 апреля 2011

Как часть большой программы, у меня есть метод, который вычисляет коэффициенты производной полинома.Но это не проблема :).В следующем коде, если я пропущу вызов realloc (), я получу ожидаемые результаты в (* coef).При использовании realloc один из элементов устанавливается в 0. Это моя ошибка или поведение realloc () действительно неожиданное?

void derive (double **coef, int size)
{
    int i;
    if (size<2)
        free_vector (*coef);
    else
    {
        for (i=0; i<size-1; ++i)
        {
            (*coef)[i] = (*coef)[i+1]*(i+1);
        }
        (*coef) = realloc ((*coef), size-1);
    }   
}

Я также приложу полный исходный код для тестовой программы, еслизапуск это поможет ...

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

double *new_vector (int size)
{
    double *vec = calloc (size, sizeof (double));
    return vec;
}

void free_vector (double *vec)
{
    if (vec)
    {
        free (vec);
        vec = NULL;
    }
}

void write_vector (FILE *f, double *vec, int size)
{
    int i;
    for (i=0; i<size; ++i)
        fprintf (f, "%1.15lf\n", vec[i]);
    fprintf (f, "\n");
}

void derive (double **coef, int size)
{
    int i;
    if (size<2)
        free_vector (*coef);
    else
    {
        for (i=0; i<size-1; ++i)
        {
            (*coef)[i] = (*coef)[i+1]*(i+1);
        }
        (*coef) = realloc ((*coef), size-1);
    }   
}

int main (void)
{
    double *v = new_vector (5);
    int i;
    for (i=0; i<5; ++i)
        v[i] = 3;
    write_vector (stdout, v, 5);
    derive (&v, 5);
    write_vector (stdout, v, 4);
    free_vector (v);
    return 0;
}

1 Ответ

8 голосов
/ 07 апреля 2011

Realloc занимает несколько байтов.

realloc ((*coef), (size-1) * sizeof(double));
                           ^^^^^^^^^^^^^^^^
...