我目前正在编写一个程序,它使用二叉搜索树来存储姓名和电话号码(基本上是电话簿)。我以前用AVL树做过这个,它运行正常。我决定为这个实现切换我的方法,而不仅仅是复制/粘贴最后一个的逻辑和格式。这样做我遇到了一个奇怪的错误,我不知道它为什么会发生。起初我认为我的问题在于我返回结构指针的方式,但它实际上是在我的字符串复制中。
我编写了一个非常基本的程序,它只显示返回结构的复制函数,然后用于递归地用数据填充BST(从文件读入)。
这是缩短的例子:
#include <iostream>
#include <string>
using namespace std;
struct Node
{
std::string first;
std::string last;
std::string phone;
};
Node* copyfunc(std::string first, std::string last, std::string phone)
{
Node* temp = NULL;
temp->first = first;
temp->last = last;
temp->phone = phone;
return temp;
}
int main()
{
std::string first, last, phone;
first = "Jenny";
last = "Something";
phone = "8675309";
Node* newStruct = NULL;
newStruct = copyfunc(first, last, phone);
cout << newStruct->first << endl;
cout << newStruct->last << endl;
cout << newStruct->phone << endl;
cout << "Never to be seen again..." << endl;
return 0;
}
现在,我尝试使用VS2013调试器找出问题所在,并在第一个副本上发生:“temp-&gt; first = first;”。它打破了访问冲突警告,然后打开xstrings(标题?)并指向部分:(第2245行)
if (this->_Myres < _Newsize)
_Copy(_Newsize, this->_Mysize); // reallocate to grow"
我只是在猜测,但从我可以收集到的内容来看,我认为创建新字符串以适应旧的字符串长度是失败的。
程序(示例和真实程序)都将编译,它们只是在到达复制功能时挂起。
感谢所有输入,谢谢!
编辑:我为我的结构使用指针的原因是由于我正在使用的算法的编写方式。在BST中实际链接节点的功能接受Node *类型而不是Node对象。 例如:recursiveInsert(Node * root,Node * newNodeToAdd);答案 0 :(得分:2)
在尝试使用之前,您没有将temp
初始化为任何有用的内容。
Node* temp = NULL;
temp->first = first; // oops! temp is NULL!
完全删除指针会更容易:
Node copyfunc(std::string first, std::string last, std::string phone)
{
Node temp = {first, last, phone};
return temp;
}
您还应该考虑通过const
引用而不是值传递参数。或者只是完全删除该功能并在需要的地方初始化Node
:
Node newStruct = {first, last, phone};
cout << newStruct.first << endl;