嘿我在c ++中有分段错误

时间:2016-12-27 08:40:35

标签: c++ algorithm data-structures tree traversal

#include<iostream>
#include<vector>
#include<stdexcept>

using namespace std;

typedef struct node* treePointer;
typedef struct node{
    int data;
    treePointer leftChild, rightChild;
};

class stack{
    private:
        int top;
    public:
        vector<treePointer> st;

        stack() : top(-1)
        {

        }

        void push(treePointer ptr){
            st.push_back(ptr);
            top++;
        }

        treePointer pop(){
            if(st.empty())
                throw out_of_range("Stack<>::pop(): empty stack");
            treePointer temp = st.back();
            top--;
            st.pop_back();
            return temp;
        }
};

 void iterInorder(treePointer ptr)
    {
        stack st;

        for( ; ;) {
            for( ; ptr ; ptr = ptr->leftChild)
                st.push(ptr);

            ptr = st.pop();
            if(!ptr) break;
            cout << ptr->data;
            ptr = ptr->rightChild;
        }
    }

    int main()
    {
        node a1, a2, a3, a4, a5, a6, a7;
        treePointer ptr;
        a1.data = 1, a2.data = 2, a3.data = 3, a4.data = 4, a5.data = 5;
        a6.data = 6, a7.data = 7;
        a1.leftChild = &a2; a1.rightChild = &a7;
        a2.leftChild = &a3; a2.rightChild = &a6;
        a3.rightChild = &a4;
        a4.leftChild = &a5;


        iterInorder(&a1);
    }

我已经通过迭代进行树遍历遍历。 但是当我打电话给iterInorder(&amp; a1)时,会出现分段错误! 在主要功能中,&#34; cout&lt;&lt; a1.data&#34;印得很好。 但是在iterInorder函数中,&#34; cout&lt;&lt; ptr-&GT;数据&#34;导致分段错误! 请帮我!我不知道为什么会发生这种情况

1 个答案:

答案 0 :(得分:1)

即使没有std::cout << ptr->data,我对Coliru也有段错误。所以你的问题来自其他部分。但是当我评论所有iterInorder函数时,不再有错误。因此,您在iterInorder内的通话中遇到了段错误。

当只执行以下代码时,我遇到了段错误。

for( ; ptr ; ptr = ptr->leftChild)
{
    st.push(ptr);
}

如果我打印所有内存地址怎么办,所以我知道哪一个会失败。

所以在main中,它给出了:

std::cout << "&a1 == " << &a1 << std::endl;
std::cout << "&a2 == " << &a2 << std::endl;
std::cout << "&a3 == " << &a3 << std::endl;
std::cout << "&a4 == " << &a4 << std::endl << std::endl;

iterInorder

for( ; ptr ; ptr = ptr->leftChild)
{
    std::cout << "ptr == " << ptr << std::endl;
    st.push(ptr);
}

在随机执行时,它给出了这个:

&a1 == 0x7ffe4ac6b750
&a2 == 0x7ffe4ac6b730
&a3 == 0x7ffe4ac6b710
&a4 == 0x7ffe4ac6b6f0

ptr == 0x7ffe4ac6b750
ptr == 0x7ffe4ac6b730
ptr == 0x7ffe4ac6b710
ptr == 0x10000ffff
bash: line 7:  5531 Segmentation fault      (core dumped) ./a.out

因此,我发现a3存在问题,a3->leftChild未提供与其他已知地址的对应关系。所以让我们来看看它的定义。

a3.rightChild = &a4;

当然,a3没有为左孩子做初始化。所以我们进入一个随机地址,它会导致段错误。 CQFD。

亲爱的juhong,我通过这篇文章向你展示(或者至少试图向你展示)的是调试艺术。到目前为止,有很多非常好用的软件可以帮助我们这样做。所以去教自己如何使用它们,这将节省你的时间,这么多时间。

顺便说一下,using namespace std;是一种不好的做法。正如Pierre Antoine Guillaume所述,如果它在头文件中使用,它将在源文件中使用,并可能导致名称冲突。