使用此结构:
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
must的函数都必须始终将MyStack **stack
指向指针的指针作为参数,并且您只能对其直接引用。
因此,灵活数组成员不是您要在此处使用的。因此,是的,使用起来最简单Item **data
-甚至Item *data
将数据项包含在堆栈中。这将意味着如上所述的双重间接访问,但是在这种情况下它将更易于处理,并且您可以传递MyStack *stack
给任何修改堆栈的函数。
PS总是以一个系数而不是一个固定的数量来扩展分配,以使摊销的插入成本是每一个插入操作为O(1)而不是O(n),即new_stack_size = new_stack_size * 5 / 4 + 1
某物...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句