C++ 奇怪的printf()结果
在结构drzewo.root->value中,我有'5' 我这样打印它,然后调用函数findNodeWithValue(): 此函数的定义如下:C++ 奇怪的printf()结果,c++,C++,在结构drzewo.root->value中,我有'5' 我这样打印它,然后调用函数findNodeWithValue(): 此函数的定义如下: Node* findNodeWithValue(Node * wierzcholek, int value) { printf("%d \n", wierzcholek->value); } 该计划的结果是: 五, 4200289 为什么? 以下是整个程序:我怀疑drzewo.root未初始化,指向堆栈上的某个地方,
Node* findNodeWithValue(Node * wierzcholek, int value) {
printf("%d \n", wierzcholek->value);
}
该计划的结果是:
五,
4200289
为什么?
以下是整个程序:我怀疑
drzewo.root
未初始化,指向堆栈上的某个地方,下一个函数调用推送的数据会修改指向的值
编辑
现在我们有了完整的源代码,我们看到这确实发生了,或多或少:在insert()
中,您不需要分配新节点,只需在堆栈上声明它。一旦离开insert()
的作用域,引用该节点的内存就不再合法
幸运的是,这很容易解决,只需正确分配新节点:
drzewo.root = new Node;
drzewo.root->value = value;
如果要删除结构,必须记住删除节点。我怀疑
drzewo.root
未初始化,并指向堆栈上的某个位置,下一个函数调用推送的数据会修改指向该位置的值
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;
编辑
现在我们有了完整的源代码,我们看到这确实发生了,或多或少:在insert()
中,您不需要分配新节点,只需在堆栈上声明它。一旦离开insert()
的作用域,引用该节点的内存就不再合法
幸运的是,这很容易解决,只需正确分配新节点:
drzewo.root = new Node;
drzewo.root->value = value;
如果要删除结构,必须记住删除节点。我怀疑
drzewo.root
未初始化,并指向堆栈上的某个位置,下一个函数调用推送的数据会修改指向该位置的值
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;
编辑
现在我们有了完整的源代码,我们看到这确实发生了,或多或少:在insert()
中,您不需要分配新节点,只需在堆栈上声明它。一旦离开insert()
的作用域,引用该节点的内存就不再合法
幸运的是,这很容易解决,只需正确分配新节点:
drzewo.root = new Node;
drzewo.root->value = value;
如果要删除结构,必须记住删除节点。我怀疑
drzewo.root
未初始化,并指向堆栈上的某个位置,下一个函数调用推送的数据会修改指向该位置的值
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;
编辑
现在我们有了完整的源代码,我们看到这确实发生了,或多或少:在insert()
中,您不需要分配新节点,只需在堆栈上声明它。一旦离开insert()
的作用域,引用该节点的内存就不再合法
幸运的是,这很容易解决,只需正确分配新节点:
drzewo.root = new Node;
drzewo.root->value = value;
如果要删除结构,必须记住删除节点。我的理论是,您试图引用的局部变量超出了
findNodeWithValue()的范围。
。当第一个函数返回时,程序流更改为findNodeWithValue(Node*wierzcholek,int-value)
。堆栈被销毁,所有局部变量也随堆栈一起销毁。因此,指向节点的指针将指向存储有随机值的随机位置。我的理论是,您试图引用的局部变量超出了findNodeWithValue()的范围。
。当第一个函数返回时,程序流更改为findNodeWithValue(Node*wierzcholek,int-value)
。堆栈被销毁,所有局部变量也随堆栈一起销毁。因此,指向节点的指针将指向存储有随机值的随机位置。我的理论是,您试图引用的局部变量超出了findNodeWithValue()的范围。
。当第一个函数返回时,程序流更改为findNodeWithValue(Node*wierzcholek,int-value)
。堆栈被销毁,所有局部变量也随堆栈一起销毁。因此,指向节点的指针将指向存储有随机值的随机位置。我的理论是,您试图引用的局部变量超出了findNodeWithValue()的范围。
。当第一个函数返回时,程序流更改为findNodeWithValue(Node*wierzcholek,int-value)
。堆栈被销毁,所有局部变量也随堆栈一起销毁。因此,指向节点的指针将指向存储有随机值的随机位置。能否提供一个最小的可编译示例?能否发布节点结构/类定义?可能value
未初始化。不要只发布随机片段。按照已经提出的要求,提交一份报告。您应该在自己的调试过程中这样做,在这个过程中,您几乎肯定会发现问题。因此,这是一项至关重要的技能。没有SSCCE,这是无法回答的(正如Lightness所指出的)。但是有一件事:findNodeWithValue()
不会返回任何内容。您能提供一个最小的可编译示例吗?您能发布节点结构/类定义吗?也许value
没有初始化。不要只发布随机片段。按照已经提出的要求,提交一份报告。您应该在自己的调试过程中这样做,在这个过程中,您几乎肯定会发现问题。因此,这是一项至关重要的技能。没有SSCCE,这是无法回答的(正如Lightness所指出的)。但是有一件事:findNodeWithValue()
不会返回任何内容。您能提供一个最小的可编译示例吗?您能发布节点结构/类定义吗?也许value
没有初始化。不要只发布随机片段。按照已经提出的要求,提交一份报告。哟
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;