【问题标题】:Resizing an malloc'ed array调整 malloc 数组的大小
【发布时间】: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 [];,否则使用该语法将毫无意义。

标签: c stack malloc


【解决方案1】:

您只需添加一个包装器,重新分配您的 stack 并更改其 sizemax_size 值:

void resize(Stack *stack, size_t new_size)
{
    stack->max_size = new_size;
    if(stack->size > stack->max_size)
         stack->size = stack->max_size;
    stack->stack = realloc(stack->stack, sizeof(Item) * new_size);
    if(stack->stack == NULL)
        errx(1,"error while resize");
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2011-11-10
    • 2021-10-01
    • 2014-01-22
    相关资源
    最近更新 更多