设置两个结构体相等后,指针为NULL

pointer is NULL after setting two struct equal each other

本文关键字:指针 NULL 结构体 两个 设置      更新时间:2023-10-16

我有两个结构体描述如下。设置huffmanTree = tempNode后,huffmanTree左右的内部指针为NULL。然而,在此之前,该值仍然有效,但在设置两个结构体彼此相等后,该值消失了。我做错了什么?

我只是想创建一个huffmanTree struct并初始化它与一些数据。然后创建一个tempNode,其中HuffmanTree *left指向huffmanTree, HuffmanTree *right指向新数据。当我从huffmanTree打印出数据时,它是NULL

// Leaf node
typedef struct HuffmanLeaf {
private:
    char data;
    int count;
public:
    HuffmanLeaf() {
    }
    void setData(char data) {
        this->data = data;
    }
    void setCount(int count) {
        this->count = count;
    }
    char getData() {
        return this->data;
    }
    int getCount() {
        return this->count;
    }
}HuffmanLeaf;

// Huffman tree
typedef struct HuffmanTree {
    HuffmanTree *right;
    HuffmanTree *left;
    HuffmanLeaf huffmanLeaf;
} HuffmanTree;
int main() {
     /* huffmanLeaf[] was defined and initialized 
     .
     .
     .
     . 
     */
    // Take the first two smallest and so on
    HuffmanTree huffmanTree;
    HuffmanTree tempNode;
    // Allocate memory for internal struct
    huffmanTree.left = new (HuffmanTree);
    huffmanTree.right = new (HuffmanTree);
    tempNode.left = new (HuffmanTree);
    tempNode.right = new (HuffmanTree);
    // Two character with least frequency. Create a new Tree
    huffmanTree.right->huffmanLeaf = huffmanLeaf[0];
    huffmanTree.left->huffmanLeaf = huffmanLeaf[1];

    // Next character
    tempNode.left = &huffmanTree;   // have node left point to huffmanTree
    tempNode.right->huffmanLeaf = huffmanLeaf[2]; // new data on node right
    /* Data is still here for tempNode */
    cout << tempNode.left->left->huffmanLeaf.getData() << endl;
    /* Error occured after this */
    huffmanTree = tempNode;
    // Value is NULL
    cout << huffmanTree.left->left->huffmanLeaf.getData() << endl; // Value is NULL
}

先做tempNode.left = &huffmanTree;,然后再做huffmanTree = tempNode;。如果不出什么差错,那才是奇迹。

说真的,在赋值之前:

huffmanTree is { new, new }
tempNode is { &huffmanTree, new }

赋值后,huffmanTree is { &huffmanTree, new }

所以你的指针跳转实际上是:

huffmanTree->huffmanTree->huffmanTree->huffmanLeaf.GetData();

并且由于您没有为"huffmanTree"定义任何huffmanLeaf,因此它返回默认值(未定义的行为,因为您没有在构造函数中初始化data)