我是C语言的新手,想写一个二叉树的代码,用插入,删除和等待的方法。在代码中,我用value = 0来表示这个结构还没有定义。(我不知道还有什么更好的方法)。问题:我们不应该插入值0。我遇到的主要问题是:为什么printf("%d\n", root.pLeft->value);
打印的是数字6422476而不是3?`
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
int value;
struct Node *pLeft;
struct Node *pRight;
};
void insert(struct Node *root, int value) {
struct Node *current = root;
while (current->value != 0) {
if (value < current->value) {
current = current->pLeft;
} else {
current = current->pRight;
}
}
current->value = value;
struct Node newLeft;
newLeft.value = 0;
struct Node newRight;
newRight.value = 0;
current->pLeft = &newLeft;
current->pRight = &newRight;
}
int main() {
struct Node root;
root.value = 0;
insert(&root, 4);
insert(&root, 3);
printf("%d\n", root.value);
printf("%d\n", root.pLeft->value);
return 0;
}
`
2条答案
按热度按时间643ylb081#
问题就在这里:
newLeft
和newRight
是存储类“auto”中的局部变量,因此它们将在封闭块结束时死亡(结束它们的生存期)。但是你使用的是这些对象的地址,* 在块之外 *,因为它们的地址逃离了块,所以你有了悬空指针。
解决方案是通过
malloc
和free
的方式动态分配对象。oyxsuwqo2#
在函数
insert
中,数据成员pLeft
和pRight
被设置为具有自动存储持续时间的本地对象的地址。这些对象
newLeft
和newRight
在退出函数后将不再有效。因此指针pLeft
和pRight
将无效,并且取消对它们的引用将调用未定义的行为。你的方法是错误的。你需要使用
struct Node *
类型的指针,它将指向树中动态分配的节点。从main
中的这个声明开始然后函数
insert
在需要时动态分配树的节点。例如,可以通过以下方式定义函数
函数的调用方式如下