C++ 如何访问指针的结构变量
c++ how to access a pointer's struct variable
>我正在尝试复制一个二叉树,其中节点在其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;
.
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 指针或结构的矢量
- MSVC将仅移动结构参数解释为指针
- 如何访问指针结构的成员变量?
- 如何将变量从变量传递到指针结构对象
- 如何在函数中检索指针结构
- C :变量的点地址至指针结构成员的地址
- C++指针结构不会被删除
- 初始化指针结构 - 内存中的外观
- C++指针结构和多线程
- c++中指针结构的运算符重载
- 为什么我不能转发声明指针结构?
- C# 如何定义新的指针结构
- 如何处理大型指针结构
- 我怎么能写一个函数的定义在模板类中声明返回指针结构对象
- 我如何编程指针结构或类变量在c++
- 具有指针结构的类所需的析构函数
- 为什么在非指针结构上进行类型转换会出现语法错误
- 语法:做binary_search (STL)排序向量的指针结构
- /a.检测到Glibc.out: munmap_chunk():无效指针- c++结构体的动态数组