C++ 如何访问指针的结构变量

c++ how to access a pointer's struct variable

本文关键字:指针 结构 变量 访问 何访问 C++      更新时间:2023-10-16

>我正在尝试复制一个二叉树,其中节点在其Node类中有一个结构。我似乎无法弄清楚为什么它在设置bookName字符串时崩溃。它不断崩溃。进入调试模式,它说它看不到参考编号或无法读取字符串。

#include <iostream>
#include <string>
using namespace std;
struct Book {
    string name;
};
struct TreeNode {
    float key;
    Book book;
    TreeNode* leftPtr;
    TreeNode* rightPtr;
};
class MyTree {
    TreeNode* rootPtr;
    // this function crashes!
    TreeNode* makeNode(float key,string bookName) {
        TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
        if (newNode == NULL) {
            cout << "Error: No more space";
        }
        else {
            newNode->key = key;
            cout << newNode->book.name << endl;
            newNode->book.name = bookName;// CRASHES HERE
            cout << "Name: " << newNode->book.name;
            newNode->leftPtr = NULL;
            newNode->rightPtr = NULL;
        }
        return newNode;
    }
    TreeNode* insert(TreeNode* nodePtr, float key, string bookName) {
        if (nodePtr == NULL) {
            nodePtr = makeNode(key, bookName);
        }
        else if (key < nodePtr->key) {
            nodePtr->leftPtr = insert(nodePtr->leftPtr, key, bookName);
        }
        else if (key > nodePtr->key) {
            nodePtr->rightPtr = insert(nodePtr->rightPtr, key, bookName);
        }
        else { cout << "Error: Key already exist. Cannot add node."; }
        return nodePtr;
    }
public:
    MyTree() { rootPtr = NULL; }
    void addNode() {
        // ask for input
        float key = 0; string bookName = "default";
        cout << "Enter a value for the key: ";
        cin >> key;
        cout << "Enter the name for the book: ";
        cin >> bookName;
        // insert
        rootPtr = insert(rootPtr, key, bookName);
    }
};
int main() {
    MyTree a;
    a.addNode();
}

调试错误消息如下:

Exception thrown at 0x0121DA2E in Assessment.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD.

请帮忙


编辑 1:按照建议替换了 malloc,但在设置 key 变量时崩溃。

TreeNode* makeNode(float key,string bookName) {
        cout << "Here";
        TreeNode* newNode = new TreeNode;// CRASHES HERE
        cout << "Here";
        if (newNode == NULL) {
            cout << "Error: No more space";
        }
        else {
            newNode->key = key;
            newNode->book.name = bookName;
            cout << "Name: " << newNode->book.name;
            newNode->leftPtr = NULL;
            newNode->rightPtr = NULL;
        }
        return newNode;
    }

如果你稍微搜索一下模式0xCDCDCDCD,你很快就会发现它是malloc的调试版本用来填充它分配的内存的东西。这反过来意味着您在程序中使用未初始化的内存。您可以使用malloc分配内存,但不初始化内存。

malloc的分配是问题的根本原因。malloc函数分配内存,但不调用对象构造函数。这反过来意味着Book结构的std::string对象不是构造的,并且以任何方式使用它都会导致未定义的行为

除了阅读好的C++书籍并正确学习C++之外,解决方案是使用 new 运算符来分配对象:

TreeNode* newNode = new TreeNode;
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));

别这样。您的TreeNode包含一个std::string,需要正确初始化。使用malloc,您无需初始化任何内容,只需分配内存。因此,当您尝试使用该字符串时,它很可能处于某种无效状态,只会造成麻烦。在C++中使用malloc的理由不多,最好这样做:

TreeNode* newNode = new TreeNode;

当不再需要它时,请delete newNode;.