c++ - 在 C++ 中构建二叉树后的分段错误
问题描述
我已经用 C++ 构建了一个二叉树。构建树后,出现分段错误。不知道为什么。
void buildTree(binTreeNode * r, int i){
if(i > 0)
{
if(r != NULL)
{
if(r->left == NULL)
{
r->left = new struct binTreeNode;
r->left->item = r->item + 1;
}
if(r->right == NULL)
{
r->right = new struct binTreeNode;
r->right->item = r ->item + 1;
}
}
i--;
buildTree(r->left, i);
buildTree(r->right, i);
}
return;
}
我在 main 中将初始 id 设置为 1
解决方案
问题很可能是由于您对struct binTreeNode
实例进行了初始化。与 Java 或 Python 等语言不同,C++ 并不总是将所有属性/成员初始化为零,而是取决于何时执行此操作的语义。
那么,引擎盖下发生了什么?当你调用new your_type;
时,操作系统会给你一块内存。你得到的唯一保证是分配的内存至少是your_type
. 如果你(非常¹⁰)幸运的话,那块内存会被设置为零。然而,更有可能的是,这块内存之前被另一个进程使用(并释放)了,该进程写入了它。因此它包含随机数据。
在实践中,这意味着,可能是binTreeNode->left
,NULL
但这并不能保证。也一样binTreeNode->right
。
怎么修:
定义一个构造函数,显式设置实例的初始值。对于您的情况,这样的事情就足够了:
struct binTreeNode {
int id;
binTreeNode* left;
binTreeNode* right;
binTreeNode()
: id{0}
, left{NULL}
, right{NULL}
{}
};
如果您从未听说过构造函数(以防万一):构造函数是特殊方法,在创建类型的新实例时调用。
作为附加说明,而不是在 C++11 中引入的NULL
use 。nullptr
推荐阅读
- android - 如何在 Android Studio 中实现 Google 地球?我想要一个像 Globe 这样的地图视图
- android - 无法解决依赖android studio
- .htaccess - 301 重定向不适用于特殊字符
- javascript - Jquery Ajax Post 但预期的 PHP 代码未运行
- rust - 无法返回对 flat_map 中临时值的引用
- c# - 如何在 smo 中无异常地使用 smo 还原 SQL Server 数据库
- asp.net - 如果没有给出参数,如何忽略添加到 XSLT 文件中的参数?
- javascript - 有没有办法使用 compilerOptions 或类似的东西在 JavaScript 中设置基本 URL?(WebStorm IDE)
- python - 有没有简单的方法来计算弯曲扇区中图像中的像素
- angular - 如何在构建时用 AOT 替换 Angular 模块?