【问题标题】:Segmentation Fault Passing Reference as Function Parameter分段故障传递参考作为函数参数
【发布时间】:2019-11-29 11:27:57
【问题描述】:

使用这段代码,当我尝试将堆栈引用传递给 transferStacks() 方法时,我遇到了分段错误。任何有助于理解为什么会这样的帮助都会有所帮助!

我可以摆脱辅助方法,它应该可以工作,但我试图从概念上理解。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;

void transferStacks(stack<int> & s1, stack<int> & s2){
    if (s1.empty()){
        for (int i = 0; i < s2.size(); i++){
            int element = s2.top();
            s1.push(element);
            s2.pop();
        }
    }
}

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    int queries = 0;
    cin>>queries;

    stack <int> newestOnTop;
    stack <int> oldestOnTop;

    while (queries!=0){
        int type = 0;
        cin >> type;
        int input = 0;
        if (type == 1){ //enqueue
            cin>>input;
            newestOnTop.push(input);
        }
        else if (type == 2){ //dequeue
            transferStacks(newestOnTop, oldestOnTop);
            oldestOnTop.pop();
        }
        else if (type == 3){ //peek
            transferStacks(newestOnTop, oldestOnTop);
            cout<<oldestOnTop.top()<<endl;
        }
        queries--;
    }  
    return 0;
}

分段错误

【问题讨论】:

  • 导致分段错误的输入是什么?

标签: c++ reference segmentation-fault stack


【解决方案1】:

您似乎相信此代码会将s2 复制到s1

    for (int i = 0; i < s2.size(); i++){
        int element = s2.top();
        s1.push(element);
        s2.pop();
    }

但不会:如果循环之前s2包含3个元素,则只会复制前2个(通常只复制前半部分)。

此外,您的transfer 函数将 s2 转移到s1,但是您调用 的方式意味着您想要相反:从s1 转移到s2。当前代码会将oldestOnTop 留空,这会在您使用oldestOnTop.top()oldestOnTop.pop() 时导致崩溃。

【讨论】:

  • 嘿,谢谢!你发现的两个问题解决了我的问题。我需要为 s2.size() 使用一个常量值,因为它的大小正在变化。我还切换了最旧的OnTop 和最新的OnTop,这可能是导致分段错误的原因。
  • 您应该将 for 循环更改为 while(!s2.empty()) {...}
  • 是的,好电话,这样我就不用担心尺寸变化了,可以轻松弹出。
猜你喜欢
  • 2012-01-17
  • 2014-03-05
  • 2019-12-28
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多