未定义的行动?程序一个接一个地打印出不同的值

时间:2015-01-05 22:59:28

标签: c++ codeblocks

我不太清楚如何描述问题 - 以及我的错误是否有任何名称。

当我运行程序时输入一些数字,例如5 tree.root-> pocz是第1个,后来是奇怪的数字。任何人都知道发生了什么以及如何修复它?

struct Node 
{

    int pocz;
    int kon;
    Node *left, *right, *up;
};

class AVL{

    public:
        Node *root;
        void initiate(){
            root = NULL;
        }
        bool insertNode(int poczPrz, int konPrz);
};

    AVL tree;

    //part of AVL insert function
   bool AVL::insertNode(int poczPrz, int konPrz){

        Node w; 
        w.pocz = poczPrz;
        w.kon = konPrz;
        Node *n = &w;

        Node *x = tree.root;
        Node *y, *z;
        y = n->left = n->right = NULL;

        while(x){
            if(x->pocz == n->pocz){
                delete n;
                return false;
            }
            y = x;
            x = (n->pocz < x->pocz) ? x->left : x->right;
        }

        if(!(n->up = y)){
            cout << "We leave the function here\n";
            tree.root = n;
            return true;
        }

        if(n->pocz < y->pocz) y->left = n;
        else y->right = n;
    }

int main()
{

    int n;  cin >> n;

    tree.initiate();
    tree.insertNode(1,n);
    cout <<"root->pocz: "<< tree.root->pocz <<endl;     //prints 1
    cout <<"root->pocz: "<< tree.root->pocz <<endl;     //now prints sth like 2306050

    return 0;
}

2 个答案:

答案 0 :(得分:0)

insertNode中,w对象具有自动存储空间,n是指向它的指针。在对该函数的调用中,它将分配tree.root = n;。函数返回后,对象被销毁,指针tree.root悬空(指向解除分配的内存)。之后,取消引用诸如tree.root->pocz之类的悬空指针将具有未定义的行为。您可以通过动态分配节点来解决这个问题。

答案 1 :(得分:0)

主要问题是n指向w,它是函数插入中的局部变量。在函数插入的末尾,w会自动删除。并且树中的指针指向空位置。在第一次cout指令中,偶然的事情没有覆盖w的先前内存位置。因此它打印1.那个内存位置被其他东西(来自cout调用)覆盖,因此它会打印垃圾。

现在的解决方案,使用Node * n = new Node;而不是将其设置为&amp; w。