1

次のコードを見てください

#include <iostream>

using namespace std;

class Stack
{
public:
    Stack();
    ~Stack();

    void push(void *data);
    void *pop();
    void print();

protected:
    typedef struct Element
    {
        struct Element *next;
        void *data;

    }Element;

    Element *top;
};

Stack::Stack()
{
    top = NULL;
}

Stack::~Stack()
{
    while(top)
    {
        Element *elm = top->next;
        delete top;
        top = elm;
    }
}

void Stack::push(void *data)
{
    Element *elm = new Element;
    elm->data = data;
    elm->next = top;;
    top = elm;
}

void *Stack::pop()
{
    void *data;

    if(top==NULL) return data;

    data = top->data;

    Element *elm = top;

    top = elm->next;
    delete elm;
    return data;


}

void Stack::print()
{
    Element *elm = top;

    while(elm)
    {
        cout << *(static_cast<int *>(elm->data))<<" ";
        elm = elm->next;
    }

    cout << endl;
}

int main()
{
    Stack *st = new Stack;;

    int n1 = 10;
    int n2 = 20;
    int n3 = 30;
    int n4 = 40;
    int n5 = 50;

    st->push(&n1);
    st->push(&n2);
    st->push(&n3);
    st->push(&n4);
    st->push(&n5);
    st->print();

    cout << *(static_cast<int*>(st->pop()))<< " poped\n";
    cout << *(static_cast<int*>(st->pop()))<< " poped\n";

    st->print();

    cout << endl;

    system("pasue");
    return 0;
}

実は、このデータ構造をこのように実装することを学んでおり、これが初めての試みです。なぜ無限ループに入るのですか?

4

2 に答える 2

2

問題は次のとおりです。

void *Stack::pop()
{
    void *data;
    //...
}

使用前に変数を初期化します。

void *Stack::pop()
{
    void *data = NULL;
    //...
}

popすべての要素を抽出するためにメソッドをループに入れた場合NULL、初期化されていない変数が任意の値 (以前のメモリ位置にあったもの) を持つ可能性があるため、返されない可能性があります。

于 2013-02-24T10:15:29.567 に答える
1

You are returning garbage value

void *Stack::pop()
{
    void *data;

    if(top==NULL) return data;

At this if(top==NULL) return data; data points garbage
You should return NULL

if(top==NULL) return top;
于 2013-02-24T10:18:00.810 に答える