为什么同一个cout的输出不同,即使它是一个接一个又是同一个变量?

时间:2016-02-15 17:17:23

标签: c++ pointers std

使用推送和弹出操作将Node添加到列表的普通类。

class listthis
    {
    private:
        struct Node {
            Node* next;
            int value;
        };
        Node* begin = nullptr;

    public:
        listthis(){
            Node newnode = Node();
            begin = &newnode;
        }

        void push(const int value){
            begin->value = value;
            begin->next = begin;
        }

当main函数调用pop时,为什么cout打印错误?

弹出功能

        int pop(){
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            int value = begin->value;
            begin->next = nullptr;
            return value;
        }

    };

主要功能

    int main(int argc, const char * argv[]) {
        listthis t = listthis();
        t.push(1);
        t.pop();
        return 0;
    }

输出:

    1  
    1  
    1  
    1  
    1952932600  
    1952932600

3 个答案:

答案 0 :(得分:0)

此构造函数

    listthis(){
        Node newnode = Node();
        begin = &newnode;
    }

已经错误并且具有未定义的行为,因为数据成员begin被分配了具有自动存储持续时间的本地可变新节点的地址。退出构造函数后,指针的值变为无效,因为局部变量不会处于活动状态,并且可能会覆盖由它占用的内存。

如果构造函数和成员函数push看起来像

,那么逻辑上会更一致
    listthis() = default;

    void push( int value )
    {
        begin = new Node { begin, value };
    }

考虑到

    void push( const int value );

    void push( int value );

声明相同的一个函数,尽管函数的定义可以取决于参数的限定符。

答案 1 :(得分:0)

您可以将构造函数更改为此类内容;

listthis()
{
  begin = new Node();
}

你的全班看起来像这样;

class listthis
    {
    private:
        struct Node {
            Node* next;
            int value;
        };
        Node* begin;

    public:
        listthis()
        {
            begin = new Node();
        }

        void push(const int value){
            begin->value = value;
            begin->next = begin;
        }

        int pop(){
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            std::cout<<begin->value<<"\n";
            int value = begin->value;
            begin->next = nullptr;
            return value;
        }
};

希望这有帮助。

答案 2 :(得分:0)

  

正确的构造函数是:

listthis(){
            Node newnode = Node();
            begin = &newnode;
            begin->next = &newnode + sizeof(Node);
    }
  

正确的推动是

void push(const T value){
        begin->next = begin + sizeof(Node);
        begin = begin->next;
        begin->value = value;
    }

但我的问题是为什么pop print错误或“value”的值不同?