奇怪的printf()结果

时间:2014-05-01 13:06:21

标签: c++

在结构 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

3 个答案:

答案 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)。堆栈被破坏,所有局部变量也随堆栈一起被破坏。因此,指向节点的指针将指向随机存储在其中的随机位置。