2017-03-29 13 views
-1
#include <iostream> 

int sizeWhileBuilding = 0; 
int sizeWhileCounting = 0; 

struct Node 
{ 
    Node(int theData) : 
     data(theData), left(NULL), right(NULL) 
    { std::cout << "Node::Node() with data " << theData << std::endl; } 

    int data; 
    Node* left; 
    Node* right; 
}; 

Node* insertNode(Node* root, int data) 
{ 
    if(!root) 
    { 
     ++sizeWhileBuilding; 
     std::cout << "Current size is " << sizeWhileBuilding << std::endl; 
     std::cout << "Making new node with " << data << std::endl; 
     root = new Node(data); 
    } 
    else if(root->data < data) 
    { 
     std::cout << "The node " << root->data << " is lesser than " << data << ". Making right node" << std::endl; 
     root->right = insertNode(root->right, data); 
    } 
    else if(root->data > data) 
    { 
     std::cout << "The node " << root->data << " is greater than " << data << ". Making left node" << std::endl; 
     root->left = insertNode(root->left, data); 
    } 
    return root; 
} 

int main() 
{ 
    std::cout << "Making binary tree" << std::endl; 

    Node* root; 
    if(root) 
    { 
     std::cout << "Root is NOT null after creation" << std::endl; 
    } 
    else 
    { 
     std::cout << "Root is null after creation" << std::endl; 
    } 
    std::cout << "==============================================================================" << std::endl; 
    root = insertNode(root, 10); 

//Problem line below 
std::cout << "The size of the tree is " << sizeWhileBuilding << std::endl; 
} 

"問題行"をコメントアウトしてこのコードを実行すると、ノード10が実行され、ツリーにノード10が挿入されます。私が問題行でそれを実行すると、私はそれがcoredumpsだと思う。グローバル変数を使用した場合のコアダンプ

問題の行なしで実行すると、メインの印刷の最初にelse部分が「作成後にルートがnullです」というメッセージが表示されます。問題enter code hereでは、「作成が印刷された後にルートがヌルではありません」という行が表示されます。

私が理解できないのは、なぜノード*ルートですか。初期化は、グローバル変数が使用されているかどうかによって異なります。

答えて

1
Node* root; 

rootはローカル変数で、初期化されていない場合はその値がガベージになります。だから時にはそれは他の何か他の時にnullptrかもしれません。したがって、それを使用すると、コアダンプで終了する未定義の動作が発生します。また

Node* root = nullptr; 

:解決策は、それを割り当てることです

私は理解していないが、なぜノード*ルートです。初期化は、グローバル変数が使用されているかどうかによって異なります。

コードに未定義の動作がある場合、何かが可能であり、記述したような奇妙な動作もあります。

関連する問題