在结构 drzewo.root-> value 我有' 5';
我这样打印,接下来我调用函数findNodeWithValue():
printf("%d \n", drzewo.root->value);
return findNodeWithValue(drzewo.root, value);
此功能的定义如下:
Node* findNodeWithValue(Node * wierzcholek, int value) {
printf("%d \n", wierzcholek->value);
}
该计划的结果是:
5
4200289
为什么?
以下是整个计划:http://pastebin.com/n2iS7bWt
答案 0 :(得分:3)
我怀疑drzewo.root
未初始化并指向堆栈的某处,下一个函数调用所推送的数据会修改指向的值。
修改强>
现在我们已经拥有了完整的源代码,我们发现这确实正在发生,或多或少:在insert()
,而不是分配一个新节点,你只需在堆栈上声明。一旦你离开insert()
的范围,指的是该节点的记忆不再合法。
幸运的是,这很容易修复,只需正确分配新节点:
drzewo.root = new Node;
drzewo.root->value = value;
如果您删除了结构,则必须记住删除节点。
答案 1 :(得分:0)
typedef struct Node NODE;
struct Node {
int value;
NODE * left = NULL;
NODE * right = NULL;
NODE * parent = NULL;
bool parentLeft;
};
struct Tree {
int levels;
int n;
NODE * root = NULL;
};
Tree drzewo;
答案 2 :(得分:0)
我的理论是你试图引用findNodeWithValue()
范围之外的局部变量。当第一个函数返回时,程序流程变为findNodeWithValue(Node * wierzcholek, int value)
。堆栈被破坏,所有局部变量也随堆栈一起被破坏。因此,指向节点的指针将指向随机存储在其中的随机位置。