代码之家  ›  专栏  ›  技术社区  ›  byron perez

定义宏时,使用std::cin的C++中的分段错误

  •  0
  • byron perez  · 技术社区  · 6 年前

    我试图解决一个与堆栈数据结构相关的问题,我有一个堆栈的实现,以及使用它的主要方法,这是一个学习问题,因为我是初学者,你们能告诉我,为什么我会出现这个错误吗

        GDB trace:
    Reading symbols from solution...done.
    [New LWP 24202]
    Core was generated by `solution'.
    Program terminated with signal SIGSEGV, Segmentation fault.
    #0  main () at solution.cc:70
    70      cin >> N;
    #0  main () at solution.cc:70
    

    我的代码如下:

    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    #define MAX_SIZE 5000000
    
    class Stack
    {
    private:
        int A[MAX_SIZE];  // array to store the stack
        int top;   // variable to mark the top index of stack. 
    public:
        // constructor
        Stack()
        {
            top = -1; // for empty array, set top = -1
        }
    
        // Push operation to insert an element on top of stack. 
        void Push(int x) 
        {
          if(top == MAX_SIZE -1) { // overflow case. 
                printf("Error: stack overflow\n");
                return;
            }
            A[++top] = x;
        }
    
        // Pop operation to remove an element from top of stack.
        void Pop() 
        {
            if(top == -1) { // If stack is empty, pop should throw error. 
                printf("Error: No element to pop\n");
                return;
            }
            top--;
        }
    
        // Top operation to return element at top of stack. 
        int Top() 
        {
            return A[top];
        }
    
        // This function will return 1 (true) if stack is empty, 0 (false) otherwise
        int IsEmpty()
        {
            if(top == -1) return 1;
            return 0;
        }
    
        // ONLY FOR TESTING - NOT A VALID OPERATION WITH STACK 
        // This function is just to test the implementation of stack. 
        // This will print all the elements in the stack at any stage. 
        void Print() {
            int i;
            printf("Stack: ");
            for(i = 0;i<=top;i++)
                printf("%d ",A[i]);
            printf("\n");
        }
    };
    
    int main() {
    
        int N;
        cin >> N;
    
        Stack S1;
        Stack S2;
    
    
        for(int i = 0; i < N; i++)
        {
            int q;
            cin >> q;
    
            if(q == 1)
            {
                int x;
                cin >> x;
    
                if(S1.IsEmpty() || S2.IsEmpty())
                {
                    S1.Push(x);
                    S2.Push(x);
                }
                else
                {
                    S1.Push(x);
                    if(x >= S2.Top()) S2.Push(x);                
                }
            }
    
            if(q==2)
            {
                if(S1.Top() == S2.Top())
                {
                    S1.Pop();
                    S2.Pop();
                }else
                {
                    S1.Pop();
                }
            }
    
            if(q==3)
            {
                cout << S2.Top() << endl;
            }
        }
    
    
        return 0;
    }
    

    如果我将MAX\u SIZE变量设置为一个较小的数字,那么代码运行良好,我想知道为什么会这样,std::cin和宏是如何交互的??,我是一个初学者,很抱歉,如果这是一个简单的问题,这是我第一次在stackoverflow中问这个问题,

    2 回复  |  直到 6 年前
        1
  •  2
  •   Jabberwocky    6 年前

    MAX_SIZE 太大了。 最大\u大小 确定 Stack 对象。由于函数中局部变量的总大小限制为几兆字节(取决于平台),因此只需超出此大小即可。

    在你的情况下,你有两个本地 堆栈 中的对象 main ( S1 S2 ),每个都需要大约20 MB(假设 sizeof int 是4)。

    这与 cin 虽然

        2
  •  0
  •   Alan Birtles    6 年前

    你的 Stack 对象在堆栈上分配。

    默认情况下,堆栈限制为每个线程1-8 MB,具体取决于您的平台。

    每个堆栈对象占用20 MB,因此堆栈空间不足。要修复此问题,请将代码更改为:

    std::unique_ptr<Stack> S1(new Stack());
    std::unique_ptr<Stack> S2(new Stack());
    

    这将在堆上分配对象,而堆只受计算机上可用内存和交换空间的大小限制。