簡體   English   中英

C ++中的怪異指針

[英]Weird pointer in c++

什么會導致指針在c ++中看起來像這樣? 我正在為一個項目構建霍夫曼樹,並且當它是當前節點的子節點之一時,我的程序將出現段錯誤。 childNode == NULL也無法檢測到。

(TreeNode *) 0x3130303030313131

編輯,按以下順序調用以下函數: buildTree() -> generateCodes()

void HuffTree::buildTree(MinHeap * heap) {
    while (heap->getSize() > 1) {
        TreeNode * n1 = heap->removeMin();
        TreeNode * n2 = heap->removeMin();

        TreeNode * p = new TreeNode(0, (n1 != NULL ? n1->getFrequency() : 0) + (n2 != NULL ? n2->getFrequency() : 0));
    p->join(n1, n2);

        heap->insert(p);
    }

    root = heap->removeMin();
}

void HuffTree::generateCodesRecursive(TreeNode * node, int right, string code) {
    if (node == NULL) return;

    if (node->isLeafNode()) {
        codes[node->getVal()] = code;
        cout << (unsigned int) node->getVal() << " " << (int) node->getFrequency() << " " << code << endl;
    }

    generateCodesRecursive(node->getLeft(), 0, code + "1");
    generateCodesRecursive(node->getRight(), 0, code + "0");
}

void HuffTree::generateCodes() {
    generateCodesRecursive(root, 0, "");
}

編輯,堆函數:

void MinHeap::insert(TreeNode * val) {
    nodes.push_back(val);   

    int index = nodes.size() -1 ;
    while (nodes[parent(index)]->getFrequency() > nodes[index]->getFrequency()){
        swapNodes(index, parent(index));    
        index = parent(index);
    }
}

TreeNode * MinHeap::removeMin() {
    if (nodes.size() == 0) return NULL;

    TreeNode* minNode = nodes[0];

    if (nodes.size() > 0){
        TreeNode* lastNode = nodes[nodes.size()-1];
        nodes.pop_back();
        nodes[0] = lastNode;
    }

    int index = 0;
    while((left(index) < nodes.size() && nodes[left(index)]->getFrequency() < nodes[index]->getFrequency()) ||
    (right(index) < nodes.size() && nodes[right(index)]->getFrequency() < nodes[index]->getFrequency())) {
        int swapIndex = right(index) >= nodes.size() ? left(index) : (nodes[left(index)]->getFrequency() <= nodes[right(index)]->getFrequency() ? left(index) : right(index));

        swapNodes(swapIndex, index);
        index = swapIndex;
    }

    return minNode;
}

需要牢記的幾件事。 當您執行TreeNode* p; p不會為null,並且將指向垃圾內存,除非條件在初始化期間明確將其設置為null ,否則不會被if (p == NULL)if (p == nullptr)條件檢測到。

另外,您是否在其構造函數中正確初始化TreeNode的內部數據成員?

如果您有一些不是指針的數據並且嘗試假裝它是指針,則將獲得這樣的無效指針值。

獲取此類指針的最可能的方法是從未初始化的指針變量。 在C和C ++中,未初始化的變量(包括指針)可能包含不可預測的“隨機垃圾”值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM