所以我试图使用我必须使用的一些给定函数将BST转换为DLL。在这样做的同时,我不断遇到分段错误。当我尝试调试它时,我终于来到了这里。我在下面写了一个非常简单的测试脚本。
我对指针的了解是它是通过引用传递的,就像我正在更改传递指针指向的值/对象一样,它反映在我原来的调用函数中。
为什么当我创建一个新节点然后传递指针(myf)时,它会起作用,但是当我只是传递指针并在函数内部创建新节点时,它会显示分段错误(myf2)?< / p>
如果这是因为新节点超出范围,请再次检查“myf”功能。我创建了一个由我的原始节点指向的新节点。并且在函数调用结束后保留它的值。这不是超出了范围吗?
我有一些基本的基本问题,它出现了指针,这确实有帮助。感谢
#include<iostream>
using namespace std;
class Node
{
public:
int val;
Node *left;
};
void myf(Node *a)
{
a->left = new Node();
a->left->val = 20;
a->val = 15;
}
void myf2(Node *a)
{
a = new Node();
a->val = 35;
}
int main()
{
Node *a = NULL, *b = NULL;
a = new Node();
a->val = 5;
myf(a);
cout << "New value of a = " << a->val << endl;
cout << "left value of a = " << a->left->val << endl;
myf2(b);
cout << "New value of b = " << b->val << endl;
}
答案 0 :(得分:1)
您的问题是,您的指针未设置为b,为此,您需要将myf2
编辑为以下内容:
void myf2(Node **a)
{
*a = new Node();
(*a)->val=35;
}
并像这样致电myf2
:
myf2(&b);
这应该解决你的问题,我相信。
不要认为Node *b
只是一个指针,也要把它想象成一个整数,因为这就是指针分解为一个指向内存空间的整数。
因此,您将指针(整数)的指针传递给函数。
另一个例子是:
void myfunction(int *i) {
*i = 5;
}
int main(int argc, char** argv) {
int x;
myfunction(&x);
cout << x << endl;
return 0;
}
但那是使用实际的整数。
答案 1 :(得分:0)
您需要返回已动态分配内存的Node *a
引用。
Node* myf(Node *a)
{
a->left = new Node();
a->left->val=20;
a->val=15;
return a;
}
在main ()
a = myf(a);
a
之前的main()
未指向myf()
函数中分配的内存...
答案 2 :(得分:0)
按以下方式通过推荐接收Node ptr
..
void myf2(Node *&a) //<-- Notice & in function signature.
在当前代码中,您按值传递a
(Node*
),因此,无论函数中所做的任何更改都不会反映在函数外部并访问b->val
({{ 1}} ptr access)将是一个段错误
答案 3 :(得分:0)
为什么当我创建一个新节点然后传递指针(myf)时,它可以工作,
节点* a:
main()
使它指向一块内存,将该地址传递给myf
,更新该块中的内存。它有效!
但是当我只是传递指针并在函数内部创建新节点时,它会显示分段错误(myf2)?
节点* b:
main()
未指定任何内容,它指向NULL
,myf2()
只获取NULL
的地址,您创建另一个指针b
(不与main()
中的相同,使其指向某个内存块,但它不会更新b
中main()
指向的内容,这仍然指向{ {1}}。因此NULL
。
基本上你正在尝试两种不同的有效方法,这是正确的方法:
案例1。
SEGFAULT
案例2。
main()
{
Node* a = NULL;
a = new Node(); //make 'a' point to some valid block of memory
myf(a); // here you are passing the address of the memory block of type Node
cout << "New value of a = " << a->val << endl; //and this is valid since 'a' points to a valid address
}
void myf(Node *a)
{
a->left = new Node();
a->left->val = 20; // Since the address that you got here is valid, you can make changes here, and in main() Node* a is aware of this address
a->val = 15;
}