1

必要に応じて内部配列バッファーを自動的に拡張する、かなり単純な(っぽい)スタック実装を作成しました。

そのために、私は当然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;
}

私はこれについて本当に無知です。助けてください!

4

2 に答える 2

3

pd_stack_dump_tomemは、インデックスを0から開始しstack size、0にデクリメントして、要素を逆の順序で追加しているように見えます。

0から開始するように変更し、次のように繰り返します。stack size

realloc無関係のようです)

于 2010-08-17T14:14:59.457 に答える
1

スタックコードにいくつかの根本的な問題があるので、それはあなたの問題ではないと思いrealloc()ます。調べて対処する必要がある事項のいくつかを次に示します。

  • スタックの一番上のアイテム(空でない場合)は、で示されます。これは、新しいアイテムを保存して(gct->stackcount - 1)から、増分するためです。ただし、一番上のアイテムにアクセスしているときは、の代わりに誤ったオフセットを使用します。特に、では、スタックの場所に有効なポインタがないため、ヒープを破壊する可能性のあるアイテムを解放します。pd_stack_push()gct->ptr_stack[gct->stackcount]stackcountgct->ptr_stack[gct->stackcount]gct->ptr_stack[gct->stackcount - 1]pd_stack_pop()

  • 新しいアイテムがスタックにプッシュされるたびpd_stack_push()に呼び出します。realloc()これは必ずしも何かを破損したり、欠陥を引き起こしたりするわけではありませんが、特に同じサイズの割り当てを常に要求するため、不要です。言い換えれば、あなたのrealloc()呼び出しは最初のものを除いてnopsでなければなりません。

  • pd_stack_pop_index()一番上のアイテムだけをポップしない限り、意味がありません(その場合pd_stack_pop()は使用する必要があります)。スタックの途中にある可能性のあるものを解放してから、をデクリメントします。これによりstackcount、基本的に最上位のアイテム(必ずしも解放したものではない)にアクセスできなくなります。解放されたスタックの中央にあるアイテムは、ポップされたときに再びアクセス/解放されます(これpd_stack_pop()が修正されていると仮定します)。

于 2010-08-17T15:08:54.627 に答える