我使用动态分配的数组实现堆栈。一旦数组已满,我需要重新分配数组并将其设置为初始数组的两倍。
我的代码:
typedef int Item;
typedef struct stackImp *Stack;
struct stackImp{
Item * items;
int top;
int maxSize;
Stack createStack (void){
Stack s = malloc(sizeof(struct stackImp));
assert(s != NULL);
s->items = malloc(DEFAULT_SIZE * sizeof(Item));
assert(s->items != NULL);
s->top = 0;
s->maxSize = DEFAULT_SIZE;
return s;
void push (Stack stack, Item item)
.
.
.
if (stack->top < stack->maxSize) {
//Over here I'm checking if the top index is less than the
//maximum Items the array can store. If it's less then it pushes the
//item to the top of the array.
stack->items[stack->top] = item;
stack->top++;
}
else {
//If the index is greater than or equal to the maximum size then
//I realloc a new array which is twice the size of the initial array.
temp = realloc(stack->items, 2*(stack->maxSize) * sizeof(Item));
assert (temp != NULL);
stack->items = temp;
.
.
.
}
当我将项目推入堆栈时,它可以正常工作,但是当我按下超过最初的maxSize时,它会给我这个错误:
我很清楚我的realloc功能有问题,但我无法找到。
这是valgrind输出:
答案 0 :(得分:0)
由于错误来自realloc
并且内存竞技场似乎已经已损坏,因此几乎可以肯定,之前正在 / em>这一点。
最好的办法是使用valgrind之类的内存调试器运行它,并检查是否有溢出缓冲区。
它可能是Item
个对象(或缺少对象)数组的初始分配,可能是top
或maxSize
等其他字段的初始化不正确。如果没有完整的代码,我们就很难说出来,如果你想要明确的答案,你应该发布所有相关代码。
但如果您不希望这样做,那么内存调试器应该会有很大帮助。
答案 1 :(得分:0)
您的代码有点令人困惑,因为stack-&gt; top实际上并不指向实际堆栈顶部的索引。这可能会导致代码的其他部分出现混淆,因为您必须使用stack-&gt; items [stack-&gt; top-1]而不是stack-&gt; items [stack-&gt; top]才能访问顶部你的堆栈。
请仔细检查这样的事情。此错误可能是由内存损坏引起的。了解如何使用内存调试器。
我建议您尝试使用列表而不是数组来实现堆栈。