gpt4 book ai didi

c++ - Visual Studio C++错误读取位置

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:50 24 4
gpt4 key购买 nike

我正在猜一个简单的问题。我正在练习编码二叉树(第一次,也许是一年后,我再次研究了 C++)。因此,当我在 VS 2013 中启动我的代码时,出现错误“未处理的异常......读取位置 address”。当我尝试调试它时,在创建根树并尝试添加第一个叶子之后,发生了,左右叶子已经有一些地址,但没有任何值(它们被指向为无法读取内存)。

但是,当我将此代码加载到某个在线编译器中时,它运行良好。所以也许它是 VS 中的一些设置,因为我没有任何其他变体,为什么它在在线编译器中工作而在 VS 中不起作用。

这是我的代码:

#include <iostream>
#include <string>
using namespace std;

struct Node
{
string value;
int key;
Node* left;
Node* right;
};

void addNodeToTree(Node* tree, int key, string value)
{
if (key < tree->key)
{
if (tree->left != nullptr)
{
addNodeToTree(tree->left, key, value);
}
else
{
Node* node = new Node();
node->key = key;
node->value = value;
cout << "Key " << key << " leaf has been successfully added to the left" << endl;
tree->left = node;

}
}
else if (key > tree->key)
{
if (tree->right != nullptr)
{
addNodeToTree(tree->right, key, value);
}
else
{
Node* node = new Node();
node->key = key;
node->value = value;
cout << "Key " << key << " leaf has been successfully added to the right" << endl;
tree->right = node;
}
}
else
{
cout << "Key " << key << " already exists." << endl;
}
}

void PrintTree(Node* node)
{
if (node != NULL)
{
if (node->left != NULL)
{
PrintTree(node->left);
}
cout << node->key << " ";
if (node->right != NULL)
{
PrintTree(node->right);
}
}
else
{
cout << "The tree is empty";
}
}

int main() {
Node* tree = new Node();
tree->key = 50;
tree->value = 2591;

addNodeToTree(tree, 20, "124525");
addNodeToTree(tree, 80, "124525");
addNodeToTree(tree, 10, "124525");
addNodeToTree(tree, 30, "124525");
addNodeToTree(tree, 50, "124525");

PrintTree(tree);

delete tree;
return 0;
}

最佳答案

这不是 VS 错误 - 当您分配 Node 结构时,leftright 成员字段未初始化,因此您的检查nullptr 进一步失败,即使 left/right 节点为空并且您在无效节点上操作。

解决方案一:

使用类而不是结构并在构造函数中初始化字段:

class Node 
{
public:
Node() : left(nullptr), right(nullptr), key(0)
{
}

string value;
int key;
Node* left;
Node* right;
};

解决方案 2:

使用创建和初始化新节点的函数:

struct Node 
{
string value;
int key;
Node* left;
Node* right;
};

Node* createNode(int key = 0)
{
Node* node = new Node();
node->left = nullptr;
node->right = nullptr;
node->key = key;
return node;
}

或者按照评论中的建议向结构添加构造函数:

struct Node 
{
Node() : left(nullptr), right(nullptr), key(0)
{
}

string value;
int key;
Node* left;
Node* right;
};

解决方案 3:

如果 C++11 可用,请使用数据成员初始化器(但据我所知,VS 不支持此操作):

struct Node 
{
string value;
int key = 0;
Node* left = nullptr;
Node* right = nullptr;
};

关于c++ - Visual Studio C++错误读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29947506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com