首页 > 解决方案 > 调整 malloc 数组的大小

问题描述

我有以下对象数组:

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 的数据结构并且他们需要调整它的大小,这可能会导致很多问题)。

标签: cstackmalloc

解决方案


您只需要添加一个包装器来重新分配您的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");
} 

推荐阅读