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

卡尔·希亚斯

使用此结构:

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[]吗?

安蒂·哈帕拉(Antti Haapala)

不,您不想为此使用灵活的数组成员(即data[];)。对的分配Item *data[]是在相同的操作中完成的,该操作分配整个对象MyStackItem *data[]位于末尾)。

但是,这将永远无法与您的堆栈一起使用,因为大概您想在其他地方保存指向堆栈对象的指针。realloc然后,当您指向之前的所有指针stack都将变为无效(确切地说,是不确定的)。否则,所有更改stackmust的函数都必须始终将MyStack **stack指向指针的指针作为参数,并且您只能对其直接引用。

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

PS总是以一个系数而不是一个固定的数量来扩展分配,以使摊销的插入成本是每一个插入操作O(1)而不是O(n),即new_stack_size = new_stack_size * 5 / 4 + 1某物...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

应该使用宏而不是灵活的数组成员吗?

无效使用灵活数组成员(不是其他成员)

具有灵活数组成员的结构的“数组”

使用数组并在结构中分配内存(灵活的数组成员)

什么是结构中的灵活数组成员?

未命名结构的灵活数组成员

具有灵活数组成员的结构的大小

嵌套结构中的灵活数组成员

联合会支持灵活的数组成员吗?

灵活的数组成员,以访问联合原始字节

C ++中的灵活数组成员的可移植仿真?

GCC与Clang复制结构灵活数组成员

灵活数组成员的静态初始化

了解 malloc 和灵活的数组成员

为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

使用指针到达数组成员

没有命名成员的GCC错误结构灵活数组成员

灵活的数组成员和指针成员:优点和缺点?

如何均匀地分配具有灵活数组成员的结构体数组?

可变长度数组和灵活数组成员之间有什么区别?

具有灵活数组成员的结构的数组如何表现?

验证数组成员

当我对结构进行浅拷贝时,灵活数组成员没有被复制

是否允许返回具有灵活数组成员的结构?

比较指向具有灵活数组成员的结构的 2 个指针

如何初始化具有 unint_t 作为灵活数组成员的结构?

在编译时初始化灵活的数组成员

灵活的数组成员会导致不确定的行为吗?

C ++“替换”为具有灵活数组成员的结构