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

卡尔·希亚斯

使用此结构:

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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在C中访问灵活数组成员

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用指针到达数组成员

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么灵活数组成员的静态初始化有效?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Arduino类数组成员

来自分类Dev

C#数组成员

来自分类Dev

Arduino类数组成员

来自分类Dev

OR 子句或数组成员检查

来自分类Dev

屏蔽数组成员的位

来自分类Dev

UPPAAL:检查数组成员

来自分类Dev

使用strcpy()对结构的char数组成员进行分段错误

来自分类Dev

如何使用数组成员作为bash中的搜索或替换模式?

来自分类Dev

使用数组成员作为fortran中do循环的控制变量

来自分类Dev

如何在Javascript中使用数组成员深度复制(克隆)对象?

来自分类Dev

使用strcpy()对结构的char数组成员进行分段错误

来自分类Dev

不能使用变量访问字段内的数组成员

来自分类Dev

是否可以使用数组成员构造此文件

来自分类Dev

从具有灵活数组成员的结构强制转换为没有该变量的其他结构是否是未定义的行为?

来自分类Dev

没有初始化的C ++数组成员

来自分类Dev

C ++中类数组成员的初始化

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

    在C中访问灵活数组成员

  5. 5

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

  6. 6

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

  7. 7

    使用指针到达数组成员

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    为什么灵活数组成员的静态初始化有效?

  12. 12

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

  13. 13

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

  14. 14

    Arduino类数组成员

  15. 15

    C#数组成员

  16. 16

    Arduino类数组成员

  17. 17

    OR 子句或数组成员检查

  18. 18

    屏蔽数组成员的位

  19. 19

    UPPAAL:检查数组成员

  20. 20

    使用strcpy()对结构的char数组成员进行分段错误

  21. 21

    如何使用数组成员作为bash中的搜索或替换模式?

  22. 22

    使用数组成员作为fortran中do循环的控制变量

  23. 23

    如何在Javascript中使用数组成员深度复制(克隆)对象?

  24. 24

    使用strcpy()对结构的char数组成员进行分段错误

  25. 25

    不能使用变量访问字段内的数组成员

  26. 26

    是否可以使用数组成员构造此文件

  27. 27

    从具有灵活数组成员的结构强制转换为没有该变量的其他结构是否是未定义的行为?

  28. 28

    没有初始化的C ++数组成员

  29. 29

    C ++中类数组成员的初始化

热门标签

归档