簡體   English   中英

realloc:反向指針數組?

[英]realloc: reversed pointer array?

我編寫了一個相當簡單的(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;
}

我真的對此毫無頭緒。 請幫助!

看起來pd_stack_dump_tomem在stack size處開始其索引並遞減為0,以相反的順序追加元素。

將其更改為從0開始並迭代到stack size

(似乎realloc是無關的)

你有一些堆棧代碼的基本問題,所以我不認為realloc()是你的問題。 以下是您應該研究和解決的一些問題:

  • 堆棧中的頂級項目(當它不為空時)由(gct->stackcount - 1) pd_stack_push() ,因為在pd_stack_push()您將新項目存儲在gct->ptr_stack[gct->stackcount]然后遞增stackcount 但是,當您訪問頂部項目時,使用不正確的偏移量gct->ptr_stack[gct->stackcount]而不是gct->ptr_stack[gct->stackcount - 1] 特別是在pd_stack_pop() ,您釋放了可能損壞堆的項,因為該堆棧位置中沒有有效指針。

  • pd_stack_push() ,每次將新項目推送到堆棧時都會調用realloc() 這不一定會腐蝕任何東西或導致缺陷,但這是不必要的 - 特別是因為你總是要求相同的大小分配。 換句話說,你的realloc()調用應該是nops,除了第一個。

  • 除非你只彈出頂部項目(在這種情況下應該使用pd_stack_pop()否則pd_stack_pop_index()甚至沒有意義。 你可以在堆棧中間釋放一些東西,然后減少stackcount ,從而使得頂級項目(不一定是你已經釋放的東西)無法訪問。 現在可以在彈出的時候再次訪問/釋放已釋放的堆棧中間的項目(假設pd_stack_pop()已修復)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM