c ++将错误复制到结构指针数据字段的字符串

时间:2015-07-22 15:43:21

标签: c++ string struct

我目前正在编写一个程序,它使用二叉搜索树来存储姓名和电话号码(基本上是电话簿)。我以前用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);

1 个答案:

答案 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;