【问题标题】:Segmentation Fault when using pointers and classes使用指针和类时出现分段错误
【发布时间】:2020-12-27 18:25:57
【问题描述】:

我正在尝试编写代码以使用堆栈创建通用树,其中 -1 表示节点结束,但我无法弄清楚我哪里出错了。 谁能帮我调试一下? 代码虽然很简单。

我发现for循环只运行了两次,并且在第二次运行结束时,有一个seg。发生故障。


using namespace std;

class Node
{
    public:
    int data;
    vector<Node> *children={nullptr};
};


int main()
{
    int a[]={10,5,4,-1,1,-1,-1,6,-1};
    int n=sizeof(a)/sizeof(a[0]);
    
    stack<Node> s;
    Node root;
    for(int i=0;i<n;i++)
    {
        if(a[i]==-1)
        s.pop();
        else
        {
            Node temp;
            temp.data=a[i];
            if(s.size()==0)
            {
                root=temp;
            }
            else
            {
                //cout<<temp.data<<endl;
                s.top().children->push_back(temp);
               // cout<<s.top().data<<endl;
            }
            
            s.push(temp);
        }
         //cout<<i<<endl;
    }

    return 0;
}````

【问题讨论】:

  • 在空堆栈上调用 pop 是未定义的行为。
  • 告诉我们它的故障所在。
  • @Someprogrammerdude:我认为从未尝试过从空堆栈弹出给定数据的情况。
  • @YvesDaoust 啊,缩进(或者更确切地说是没有缩进)让我印象深刻。不过,实际上确保可能是个好主意。
  • 鉴于数组输入,代码不允许对空堆栈进行弹出操作

标签: c++ pointers vector tree segmentation-fault


【解决方案1】:

children 是一个指针,但你永远不会分配任何内存让它指向。

这里绝对不需要指针。改变这个

vector<Node> *children={nullptr};

到这里

vector<Node> children;

还有这个

s.top().children->push_back(temp);

到这里

s.top().children.push_back(temp);

这应该是一个改进,但老实说不确定代码是否正确,即使有这些更改。

使用向量的主要好处是避免处理指针。所以一个指向向量的指针很少(几乎从来没有)有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 2020-10-04
    • 1970-01-01
    • 2022-11-16
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多