c-使用灵活的数组成员来实现堆栈



使用此结构:

typedef struct MyStack {
size_t     size;      // current size of stack
size_t     max;       // max size of stack
Item*      data[];
} MyStack;

如何先进行正确的malloc,然后进行realloc?例如,如果我这样做:

MyStack* stack = malloc(sizeof(MyStack));
stack->data  = malloc(size * sizeof(Item*));
// ... and later on...
stack->data = realloc(stack->data, new_stack_size);

我得到以下错误:

错误:灵活数组成员的使用无效
错误:柔性数组成员的无效使用(以上每项一个错误)

那么,正确的方法是什么?使用Item** data而不是Item data[]会更简单吗?

否,您不希望为此使用灵活的数组成员(即data[];)。Item *data[]的分配是在分配整个MyStack相同操作中完成的,因为Item *data[]将位于其末尾

然而,这永远不会适用于您的堆栈,因为可能您希望在其他地方保存指向堆栈对象的指针。当您realloc时,所有指向先前stack指针都将变为无效(确切地说是不确定的)。否则,所有更改stack的函数都必须始终将MyStack **stack指针到指针作为参数,并且只能有一个对它的直接引用

因此,灵活的数组成员不是您想要在这里使用的。因此,是的,如果数据项包含在堆栈内,则仅使用Item **data甚至Item *data会更简单。这意味着如上所述的双重间接性,但在这种情况下处理起来要简单得多,并且可以将MyStack *stack传递给任何修改堆栈的函数。

p.S.总是通过因子而不是恒定量来扩展分配,这样每个插入操作的摊余插入成本是O(1),而不是O(n)

相关内容

  • 没有找到相关文章