0

我在另一个文件中有一个主程序调用一个函数cbuf_update(),该函数又调用cbuf_sizeChange() 这让我感到困惑:在内部cbuf_update,正确调用cbuf_sizeChange更新cb_ptr,但在 main.c 中,当我在.cb 中释放 cb1 时,它是垃圾sizeChange()。我无法将其设为静态,因为 main 中有可变数量的 cbuf。我该怎么办?我无法更改 的签名cbuf_update()

结构定义:

typedef struct cbuf {
    unsigned int max;
    unsigned int start;
    unsigned int end;
    unsigned int size;
    quote *quotes;
} cbuf;

从 main.c 调用:

cbuf *eur_jpy;
eur_usd = cbuf_init() ;
cbuf_update(eur_jpy, time, rate) ;

其他文件中的相关方法:

cbuf * cbuf_init()
{
    //initialize the cbuf with malloc

    return cb1;
}

void cbuf_update(cbuf *cb_ptr, double rate)
{
    cb_ptr = cbuf_sizeChange(cb_ptr, 2);
}

cbuf *cbuf_sizeChange(cbuf *cb1, double factor)
{
        cbuf *cb2;
    quote *quotes;
    quotes = (quote *)malloc(cb1->max * factor * sizeof(quote));
    cb2 = (cbuf *)malloc(sizeof(*quotes) + 4 * sizeof(unsigned int));

        //Update quotes here(exluding it)

        cb2->size = cb1->size;
    cb2->end = cb1->size - 1;
    cb2->max = factor * cb1->max;
    cb2->start = 0;
    free(cb1->quotes);
    free(cb1);

    cb2->quotes = quotes;

    return cb2;
}
4

1 回答 1

5

这一点看起来不对:

void cbuf_update(cbuf *cb_ptr, double rate)
{
    cb_ptr = cbuf_sizeChange(cb_ptr, 2);
}

它修改,这是您作为第一个参数cb_ptr传入的任何内容的本地副本。cbuf_update()

您可能想按照以下思路进行思考:

void cbuf_update(cbuf **cb_ptr, double rate)
{
    *cb_ptr = cbuf_sizeChange(*cb_ptr, 2);
}

而不是调用cbuf_update(something, rate)call cbuf_update(&something, rate)

于 2013-04-09T23:14:58.160 回答