Ошибка сегментации в C++ с std :: cin при определении макроса

Я пытаюсь решить проблему, связанную со структурой данных стека, у меня есть реализация стека и основной метод, который его использует, это вопрос для обучения, так как я новичок, можете ли вы, ребята, сказать мне, почему я получить эту ошибку ?:

    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_SIZE меньшее число, код работает хорошо, я хочу знать, почему это так, как std :: cin и макросы взаимодействуют ??, я новичок, извините, если это простой вопрос, это первый раз, когда я спрашиваю в stackoverflow,

1) "Ошибка сегментации в C с помощью std :: cin" Это невозможно. В C нет std::cin. 2) "я новичок, извините, если это простой вопрос" Если вы новичок, вам следует учиться на хорошая книга C++ вместо того, чтобы кодировать случайным образом.

Algirdas Preidžius 09.05.2018 17:30

извините, я отредактировал вопрос, пожалуйста, простите меня

byron perez 09.05.2018 17:32

В дополнение к Майклу Уолзу: До cin >> N; могло быть выделение памяти для Stack S1; и Stack S2;. MAX_SIZE оказывает прямое действие на sizeof (Stack). Если вы сделаете MAX_SIZE большим, это может превысить ваш доступный размер стека. Следовательно, приложение умирает. cin >> N; - это строка исходного кода, ближайшая к адресу, в котором находится ваше приложение. умирает. Следовательно, похоже, что это был тот, который потерпел неудачу, но на самом деле это не связано. Чтобы доказать мне, просто вставьте вывод перед cin >> N;, например. cout << "Start\n";. Бьюсь об заклад, тогда это покажется неудачным ...

Scheff's Cat 09.05.2018 17:37

Что вы имеете в виду под "как std :: cin и макросы взаимодействуют?"

Jabberwocky 09.05.2018 17:43

MAX_SIZE слишком велик для стека, уменьшите его до меньшего числа, чтобы избавиться от ошибки сегментации. Обратитесь сюда, cs.nyu.edu/exact/core/doc/stackOverflow.txt, если вы хотите изменить размер стека для вашей программы.

Archie Yalakki 09.05.2018 17:50

о, может быть, я могу сказать, как cin и это определение макроса связаны таким образом, что изменение одного влияет на другое, извините за мой английский

byron perez 09.05.2018 17:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
153
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

MAX_SIZE слишком велик. MAX_SIZE определяет размер ваших объектов Stack. Поскольку общий размер локальных переменных в функции ограничен несколькими мегабайтами (в зависимости от платформы), вы просто превышаете этот размер.

В вашем случае у вас есть два локальных объекта Stack в main (S1 и S2), каждый из которых занимает примерно 20 Мбайт (при условии, что sizeof int равен 4).

Однако это совершенно не связано с cin.

Ваши объекты Stack размещены в стеке.

По умолчанию размер стека ограничен примерно 1-8 МБ на поток в зависимости от вашей платформы.

Каждый из ваших объектов стека занимает 20 МБ, поэтому у вас заканчивается пространство стека. Чтобы исправить это, измените свой код на:

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

Это выделит ваши объекты в куче, которая ограничена только размером доступной памяти и пространства подкачки на вашем компьютере.

Другие вопросы по теме