3

如果我有两个结构:

typedef struct{
    unsigned int time;
    double rate;

}quote;

typedef struct{

    unsigned int freeSlots;
    unsigned int end;
    unsigned int start;
    unsigned int currSize;
    unsigned int maxSize;
    unsigned int startAt;
    //unsigned int currIndex;
    quote quoteBuffer[1];

}cbuf;

我想创建一个函数来修改 cbuf 中的 quoteBuffer 数组的大小,我该怎么做呢?我尝试了几种方法,但到目前为止都没有奏效。我不断返回相同的格式:

quote *newQuoteBuffer = malloc(sizeof(quote) * newSize);

如果我在某处已经有一个现有的 cbuf(例如,我们将其称为“a”,其中 a 是指向 cbuf 的指针):

a->quoteBuffer = newQuoteBuffer;

但显然这行不通。有什么提示吗?

4

4 回答 4

2

这个:

quote quoteBuffer[1];

应该:

quote *quoteBuffer;

然后分配将起作用。

取消引用quote看起来像这样:

a->quoteBuffer->time;

如果您稍后使用 malloc() 分配了多个引用元素,则可以像这样访问它们:

a->quoteBuffer[i].time;
于 2013-05-21T09:05:08.910 回答
1

如果您不确定有多少元素会进入quoteBuffer,请维护一个相同的链表。为了那个原因

quote *quoteBuffer;

并根据需要继续向缓冲区添加或删除元素。

于 2013-05-21T09:06:33.570 回答
1

我认为您错过了为什么有人将结构的最后一个元素作为单个元素数组的要点。这是在旧 C 代码中用作使结构大小可变长度的一种技巧。

您可以编写如下代码:

Bitmapset *p = malloc(offsetof(Bitmapset, quoteBuffer) + n * sizeof(quote));

然后你写这样的代码:

p->quoteBuffer[0]

取决于:

p->quoteBuffer[n-1]

正如您所猜测的那样,您不想直接将指针分配给 quoteBuffer。

那么,为什么要将quoteBuffer 声明为:quote quoteBuffer[1]; 而不是quote*quoteBuffer;?

这是因为您不想为quoteBuffer 单独分配。单个分配可用于整个 cbuf,包括内联引用数组。

于 2013-05-21T09:21:56.800 回答
0

有两种方法。一种是在 cbuf 中使用指针,正如其他人提到的那样,通过更改

quote quoteBuffer[1];

quote* quoteBuffer;

另一种是调整 cbuf 的大小:

#include <stddef.h> // for offsetof

struct cbuf* realloc_cbuf(struct cbuf* cbufp, size_t nquotes)
{
    struct cbuf* new_cbufp = realloc(cbufp, offsetof(struct cbuf, quoteBuffer) + nquotes * sizeof *cbufp->quoteBuffer);
    if (!new_cbufp)
    {
        // handle out of memory here. cbufp is still intact so free it if you don't need it.
    }
    return new_cbufp;
}

void elsewhere(void)
{
    struct cbuf* acbuf = NULL;
    acbuf = realloc_cbuf(1);
    acbuf = realloc_cbuf(10);
    // etc. 
}
于 2013-05-21T09:12:45.063 回答