[英]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.