使用此结构:
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)