创建节点时指针的C ++问题

时间:2014-03-02 07:11:10

标签: c++ pointers

所以我试图使用我必须使用的一些给定函数将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;
}

4 个答案:

答案 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);

<{1}}中的a之前的main()未指向myf()函数中分配的内存...

答案 2 :(得分:0)

按以下方式通过推荐接收Node ptr ..

void myf2(Node *&a) //<-- Notice & in function signature.

在当前代码中,您按值传递aNode*),因此,无论函数中所做的任何更改都不会反映在函数外部并访问b->val({{ 1}} ptr access)将是一个段错误

答案 3 :(得分:0)

  

为什么当我创建一个新节点然后传递指针(myf)时,它可以工作,

节点* a: main()使它指向一块内存,将该地址传递给myf,更新该块中的内存。它有效!

  

但是当我只是传递指针并在函数内部创建新节点时,它会显示分段错误(myf2)?

节点* b: main()未指定任何内容,它指向NULLmyf2()只获取NULL的地址,您创建另一个指针b(不与main()中的相同,使其指向某个内存块,但它不会更新bmain()指向的内容,这仍然指向{ {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; 
}