【发布时间】:2020-06-09 16:42:37
【问题描述】:
我一直在 LeetCode 上为 Min Stack 编写代码。 我遇到的问题是当我尝试重新分配内存(在推送方法上)时,它告诉我“地址清理器:堆缓冲区溢出。”
是什么原因造成的,我该如何解决这个问题?谢谢
另外,解决这个问题的更好方法是什么?
typedef struct {
int top;
int *arr;
int min;
int size;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack* stack = (MinStack*)malloc(sizeof(MinStack));
stack->size = 10;
stack->top = -1;
stack->min = INT_MAX;
stack->arr = (int*) malloc(sizeof(int)*(stack->size));
return stack;
}
void minStackPush(MinStack* obj, int x) {
//if top+1 is equal to the size of the stack(when stack is full),
//I want to multiply the size by 2
//so more numbers can fit in the stack.
if(obj->top+1 == obj->size){
obj->size = obj->size*2; // this line seems to give me issues.
obj->arr = realloc(obj->arr, obj->size);
}
obj->arr[obj->top+1] = x;
obj->top++;
}
【问题讨论】:
-
不确定这是您问题的整个原因,但
obj->arr = realloc(obj->arr, obj->size);行不应该在前面的if块inside ?否则,您每次推送一个值时都会重新分配内存。 -
你说得对,我试图让它以不同的方式工作。但这仍然给我带来了问题。如果我只是删除 if 语句,那么它工作得很好。但我希望它只在堆栈已满时增加大小:/
-
这也不是
realloc的正确方式。您应该为失败案例保存旧的指针值。是的,根本没有处理故障。
标签: c stack stack-overflow heap-memory