嘿,我在 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
所说,如果它在头文件中使用,它将在源文件中使用,并可能导致名称冲突。
#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
所说,如果它在头文件中使用,它将在源文件中使用,并可能导致名称冲突。