realloc():检测到无效的下一个大小的glibc

时间:2015-03-20 03:34:19

标签: c size dynamic-arrays realloc

我使用动态分配的数组实现堆栈。一旦数组已满,我需要重新分配数组并将其设置为初始数组的两倍。

我的代码:

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输出:

2 个答案:

答案 0 :(得分:0)

由于错误来自realloc并且内存竞技场似乎已经已损坏,因此几乎可以肯定,之前正在 / em>这一点。

最好的办法是使用valgrind之类的内存调试器运行它,并检查是否有溢出缓冲区。

它可能是Item个对象(或缺少对象)数组的初始分配,可能是topmaxSize等其他字段的初始化不正确。如果没有完整的代码,我们就很难说出来,如果你想要明确的答案,你应该发布所有相关代码。

但如果您不希望这样做,那么内存调试器应该会有很大帮助。

答案 1 :(得分:0)

您的代码有点令人困惑,因为stack-&gt; top实际上并不指向实际堆栈顶部的索引。这可能会导致代码的其他部分出现混淆,因为您必须使用stack-&gt; items [stack-&gt; top-1]而不是stack-&gt; items [stack-&gt; top]才能访问顶部你的堆栈。

请仔细检查这样的事情。此错误可能是由内存损坏引起的。了解如何使用内存调试器。

我建议您尝试使用列表而不是数组来实现堆栈。