【问题标题】:Segmentation fault when trying to push to either an int stack or vector in C++尝试推送到 C++ 中的 int 堆栈或向量时出现分段错误
【发布时间】:2020-07-23 03:40:54
【问题描述】:

现在我正在尝试解决一个竞争性编程问题,但是每当我尝试推送到向量 (bb) 时,它都会给我一个段错误。我尝试通过从堆栈切换到向量并尝试推送没有变量的常规整数来解决此问题,但我没有运气。

#include <bits/stdc++.h>
#include <iostream>
#include <stack>
using namespace std;


int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t, n;
    cin >> t;

    for(int e = 0; e < t; e++){

        cin >> n;
        int want = 1, temp;
        bool flag = true;
        stack<int> mountain;
        vector<int> bb;

        for(int i = 0; i < n; i++){
            cin >> temp;
            mountain.push(temp);
        }

        while(!mountain.empty() || !bb.empty()){

            if(mountain.top() == want){
                mountain.pop();
                want++;

            }else if(!bb.empty() && bb.back() == want){
                bb.pop_back();
                want++;

            }else if(mountain.size() > 1){
                 bb.push_back(mountain.top()); // <-----------------
                mountain.pop();

            }else{
                cout << "N\n";
                flag = false;
                break;

            }
            if(flag && want == n + 1) cout << "Y\n";
        } 

    }   

    return 0;
    }

如果您需要有关问题的任何上下文,可以找到here

【问题讨论】:

  • 这看起来像是来自一些在线竞赛网站的典型拼图。如果您的目标是学习 C++,那么您将不会在那里学到任何东西。在几乎所有情况下,就像这个一样,正确的解决方案需要了解某种数学或编程技巧。如果您不知道诀窍是什么,并尝试编写蛮力方法,那么您的程序将永远运行,并因此而失败。如果你想学习 C++,你不会从毫无意义的在线竞赛网站 but only from a good C++ book 学到任何东西。
  • @SamVarshavchik 感谢您的快速响应,但我不关心实际问题的解决,我很确定我现在已经计划好了一个好的解决方案。只是我尝试推送到 bb 的那一行代码给我带来了麻烦。
  • 您能否将有问题的输入也发布到您的程序中?
  • 如果您不“关心实际的问题解决”并且想了解段错误的原因,那么这就是您的调试器的用途。只需使用调试器运行程序,一次一行,监控所有变量的值,观察它们的变化,并亲自查看段错误的原因。当您在调试器中运行此程序时,您看到了什么?
  • 我没有尝试实际解决问题,但您的问题不在向量或 push_pack 中。 segfault 来自if(mountain.top() == want){ 行。您正在尝试获取空堆栈顶部的值。我从一个简单的gdb 会话中获得了这些信息。

标签: c++ vector segmentation-fault stack push-back


【解决方案1】:

当我编译您的代码并通过gdb 运行它时,我在以下行得到一个段错误:

 while(!mountain.empty() || !bb.empty()){

            if(mountain.top() == want){    <-------------------
                mountain.pop();
                want++;

这是因为在您的while 检查中,您测试bb OR mountain 是否为空以继续。 bb 不是空的,山。然后,您尝试致电 mountain.top(),这会导致您的段错误。

这里需要清理一些逻辑。

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 2013-04-16
    • 2020-07-17
    • 2017-11-20
    • 1970-01-01
    • 2012-08-09
    • 2015-02-14
    • 2021-08-05
    相关资源
    最近更新 更多