Я пытаюсь решить проблему, связанную со структурой данных стека, у меня есть реализация стека и основной метод, который его использует, это вопрос для обучения, так как я новичок, можете ли вы, ребята, сказать мне, почему я получить эту ошибку ?:
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,
извините, я отредактировал вопрос, пожалуйста, простите меня
В дополнение к Майклу Уолзу: До cin >> N; могло быть выделение памяти для Stack S1; и Stack S2;. MAX_SIZE оказывает прямое действие на sizeof (Stack). Если вы сделаете MAX_SIZE большим, это может превысить ваш доступный размер стека. Следовательно, приложение умирает. cin >> N; - это строка исходного кода, ближайшая к адресу, в котором находится ваше приложение. умирает. Следовательно, похоже, что это был тот, который потерпел неудачу, но на самом деле это не связано. Чтобы доказать мне, просто вставьте вывод перед cin >> N;, например. cout << "Start\n";. Бьюсь об заклад, тогда это покажется неудачным ...
Что вы имеете в виду под "как std :: cin и макросы взаимодействуют?"
MAX_SIZE слишком велик для стека, уменьшите его до меньшего числа, чтобы избавиться от ошибки сегментации. Обратитесь сюда, cs.nyu.edu/exact/core/doc/stackOverflow.txt, если вы хотите изменить размер стека для вашей программы.
о, может быть, я могу сказать, как cin и это определение макроса связаны таким образом, что изменение одного влияет на другое, извините за мой английский





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