c++ - 段错误将引用作为函数参数传递

标签 c++ reference segmentation-fault stack

在这段代码中,我在尝试将堆栈引用传递给 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;
}

段错误

最佳答案

您似乎相信此代码会将 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,但是您 call 它意味着您打算相反:从s1 转移到s2。当前代码会将 oldestOnTop 留空,这将在您使用 oldestOnTop.top()oldestOnTop.pop() 时导致崩溃。

关于c++ - 段错误将引用作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57129896/

相关文章:

java - Java中被误解的对象实例化

c - main 执行前出现段错误

C 去除字符串中的特殊字符

检查用户输入是否在特定限制之间,如果在输入正确的输入之前不再询问

c++ - 我如何在 C++ 中追加一个 struct Person

c++ - 在 C++ 中创建模板时是否可以找到 sizeof(T)?

c++ - 类型已知时如何调用 std::forward

c++ - 延迟函数调用中的延迟函数调用

c++ - 杀死入侵者在 C++ 中不起作用

c++ - 引用失效保证会自动应用于指针吗?