我在另一个文件中有一个主程序,调用了一个函数cbuf_update(),该函数又调用了这是让我cbuf_sizeChange() 感到困惑的地方:在内部cbuf_update,调用了cbuf_sizeChange正确的更新cb_ptr,但是在main.c中,从中释放cb1以来这是垃圾sizeChange()。我不能将其设置为静态,因为main中的cbuf数量是可变的。我该怎么办?我无法更改的签名cbuf_update()。
结构def:
typedef struct cbuf {
unsigned int max;
unsigned int start;
unsigned int end;
unsigned int size;
quote *quotes;
} cbuf;
Run Code Online (Sandbox Code Playgroud)
从main.c调用:
cbuf *eur_jpy;
eur_usd = cbuf_init() ;
cbuf_update(eur_jpy, time, rate) ;
Run Code Online (Sandbox Code Playgroud)
其他文件中的相关方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
这一点看起来不正确:
void cbuf_update(cbuf *cb_ptr, double rate)
{
cb_ptr = cbuf_sizeChange(cb_ptr, 2);
}
Run Code Online (Sandbox Code Playgroud)
它会修改cb_ptr,这是您cbuf_update()作为第一个参数传入的内容的本地副本。
您可能需要按照以下思路考虑:
void cbuf_update(cbuf **cb_ptr, double rate)
{
*cb_ptr = cbuf_sizeChange(*cb_ptr, 2);
}
Run Code Online (Sandbox Code Playgroud)
而不是打电话cbuf_update(something, rate)给call cbuf_update(&something, rate)。