简体   繁体   中英

Segmentation fault in C++ with std::cin while macro is defined

I am trying to solve a problem related to stack data structure, I have an implementation of a stack, and a main method that uses it, this is a for-learning question as i am a beginner, can you guys tell me, why i get this error?:

    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

my code is the following:

#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;
}

if i set MAX_SIZE variable to a lower number the code runs well, i want to know why is that the case, how std::cin and macros interact??, i am a beginner, sorry if this is a simple question it is the first time that i am asking in stackoverflow,

MAX_SIZE is far too big. MAX_SIZE determines the size of your Stack objects. As the total size of local variables in a function is limited to a few megabytes (depending on the platform), you simply exceed this size.

In your case you have two local Stack objects in main ( S1 and S2 ), each of them taking roughly 20 Mbytes (assuming sizeof int is 4).

This is totally unrelated to cin though.

Your Stack objects are allocated on the stack.

By default the stack is limited to something like 1-8 MB per thread depending on your platform.

Each of your stack objects takes up 20 MB so you are running out of stack space. To fix this change your code to:

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

This will allocate your objects on the heap which is only limited by the size of the available memory and swap space on your machine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM