realloc:反向指针数组?

时间:2010-08-17 14:11:18

标签: c realloc

我编写了一个相当简单的(ish)堆栈实现,如果需要,它会自动增长其内部数组缓冲区。

为此,我自然会使用realloc - 但是,在realloc()调用之后,所有数组元素都是反向排序的。

有问题的代码:

此示例将触发所述行为:

#include "pd/strlib.h"
#include "pd/stack.h"
#include "pd/memory.h"
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int index = 0;
    char* buffer;
    pd_stack_t* stc = pd_stack_new();
    pd_stack_push(stc, "blue");
    pd_stack_push(stc, "green");
    pd_stack_push(stc, "red");
    pd_stack_push(stc, "yellow");
    pd_stack_push(stc, "pink");
    pd_stack_push(stc, "olive");
    pd_stack_push(stc, "beige");
    pd_stack_push(stc, "gold");
    pd_stack_push(stc, "grey");
    pd_stack_push(stc, "lime");
    pd_stack_push(stc, "khaki");
    while((index++) != 500)
    {
        pd_stack_push(stc, "__random_value__");
    }
    buffer = (char*)malloc(pd_stack_size(stc));
    pd_stack_dump_tomem(stc, buffer, 1);
    fprintf(stdout, "%s", buffer);
    return 0;
}

我真的对此毫无头绪。请帮忙!

2 个答案:

答案 0 :(得分:3)

看起来pd_stack_dump_tomem在stack size处开始索引并递减为0,以相反的顺序附加元素。

将其更改为从0开始并迭代到stack size

(似乎realloc无关)

答案 1 :(得分:1)

您的堆栈代码存在一些基本问题,因此我认为realloc()不是您的问题。以下是您应该研究和解决的一些问题:

  • 堆栈中的顶级项目(当它不为空时)由(gct->stackcount - 1)指向,因为在pd_stack_push()中您将新项目存储在gct->ptr_stack[gct->stackcount]中,然后递增{{ 1}}。但是,当您访问顶部项目时,使用的偏移量不正确stackcount而不是gct->ptr_stack[gct->stackcount]。特别是,在gct->ptr_stack[gct->stackcount - 1]中,您释放了可能破坏堆的项,因为该堆栈位置中没有有效的指针。

  • 每次将新项目推送到堆栈时,pd_stack_pop()中的
  • 都会调用pd_stack_push()。这不一定会腐蚀任何东西或导致缺陷,但这是不必要的 - 特别是因为你总是要求相同的大小分配。换句话说,除了第一个调用之外,您的realloc()调用应该是nops。

  • realloc()甚至没有意义,除非您只弹出顶部项目(在这种情况下应使用pd_stack_pop_index())。你可以在堆栈中间释放一些东西,然后递减pd_stack_pop(),从而使顶级项目(不一定是你已经释放的东西)无法访问。现在可以在弹出的时候再次访问/释放已释放的堆栈中间的项目(假设stackcount已修复)。