嘿,我在 C++ 中有一个分段错误

hey I have a segmentation fault in c++

#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(&a1) 时,分段错误出现了! 在 main 函数中, "cout << a1.data" 打印得很好。 但在 iterInorder 函数中,"cout << ptr->data" 导致分段错误! 请帮我!我不知道为什么会这样

即使没有 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没有对左边child进行初始化。所以我们进入一个随机地址,它会导致段错误。 CQFD.

亲爱的 juhong,我通过这个小 post 向您展示(或至少试图向您展示)的是 调试艺术 。到现在为止,确实有非常好的和有用的软件可以帮助我们这样做。所以去自学如何使用它们,这会节省你很多时间。

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