C如何修改其他结构中的结构的内存

时间:2013-05-21 09:01:29

标签: c arrays struct

如果我有两个结构:

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 个答案:

答案 0 :(得分:2)

此:

quote quoteBuffer[1];

应该是:

quote *quoteBuffer;

然后分配将起作用。

解除引用quote如下所示:

a->quoteBuffer->time;

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

a->quoteBuffer[i].time;

答案 1 :(得分:1)

如果您不确定quoteBuffer中将包含多少元素,请维护相同的链接列表。为此

quote *quoteBuffer;

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

答案 2 :(得分:1)

我认为你忽略了为什么有人会将结构的最后一个元素作为单个元素数组。这是一种在旧C代码中用作使结构大小变长的方法。

您可以编写如下代码:

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

然后你编写这样的代码:

p->quoteBuffer[0]

最多:

p->quoteBuffer[n-1]

您不希望直接将指针指定给quoteBuffer,正如您所猜测的那样。

那么,为什么要将quoteBuffer声明为:     引用引用缓冲[1]; 代替     quote * quoteBuffer; ?

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

答案 3 :(得分: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. 
}