【发布时间】:2021-05-05 07:00:06
【问题描述】:
我有以下对象数组:
typedef struct MyStack {
size_t size; // current size of stack
size_t max; // max size of stack
Item* stack[];
} MyStack;
我想创建一个包含十个项目的堆栈,所以我这样做了:
MyStack stack = malloc(sizeof MyStack);
stack->size = 0;
stack->max = 10;
stack->stack = malloc(sizeof Item * 10);
然后假设我填满了堆栈 - 我有十个项目。我想将堆栈大小调整为 15 个项目。这样做的方法是什么,包括显然将现有的 10 个项目复制到新堆栈中?根据定义,问题是否意味着在内存中的某一时刻我将分配 25 个项目? (这里不重要,但我可以想象如果有人有一个 2GB 的数据结构并且他们需要调整它的大小,这可能会导致很多问题。
【问题讨论】:
-
查找
realloc,如果有足够的连续内存可用,它会尝试重新分配。此外,Item* stack[];声明了一个Item *数组,而malloc(sizeof Item * 10);似乎分配了一个Item数组。 -
@dxiv 感谢您指出这一点。所以应该是:
malloc(sizeof Item* * 10)? -
对,或者
malloc(10 * sizeof *stack->stack),这是另一种惯用的写法。 -
更正,以上内容适用于
Item** stack;,这是我出于某种原因(误)读它的方式,但对于灵活数组Item* stack[];,不是你的意思是。一个灵活的数组嵌入在父结构中,并且永远不会被 malloc 本身。 -
您希望灵活的数组成员类型为
Item [];,否则使用该语法将毫无意义。