Ошибка сегмента в операторе возврата в функции

Моя программа должна конвертировать подсказку из инфикса в постфикс. До сих пор, с помощью отладчика и других методов, я нашел точную точку, в которой я segfault, но не понимаю, почему.

Вот мой код:

Вот itop.h:

using namespace std;
#include <cstdlib>
#include <iostream>

class sNode{
public:
char data;
sNode *next;
};

class stack{
public:
sNode *head;
void push (char);
sNode pop();
int rank(char);
stack()
{
cout << "Initiliazing stack." << endl;
}
};

Это мой файл itop.cpp:

    #include "itop.h"
void stack::push (char a)
{
// cout << "Pushing " << a << endl;
sNode *sn;
sn = new sNode;
sn->data = a;
sn->next = head;
head = sn;
}

sNode stack::pop()
{
// cout << "Popping stack." << endl;
sNode *sn;
sn = head;
head = head->next;
return *sn;
}

int stack::rank(char x)
{
int num = 0;
// cout << "Checking rank." << endl;
if(x == '\0')
{
num = 1;
// cout << "Checking for null" << endl;
return num;
}
else if(x == '+' || x == '-')
{
num = 2;
// cout << "Checking if + or -" << endl;
return num;
// cout << "After return." << endl;
}
else if(x == '*' || x == '/')
{
num = 3;
// cout << "Checking for * or /" << endl;
return num;
}
else
cout << "Error! Input not valid!" << endl;
}

И вот main.cpp:

using namespace std;
#include <iostream>
#include <cstdlib>
#include <cstring>
#include "itop.h"
int main()
{
char *temp1;            //Instantiating variables.
char *temp2;
temp1 = new char[20];
temp2 = new char [20];
stack s;
do              //Checking commands.
{
cout << "infix_to_postfix> ";
cin >> temp1;
if(strcmp(temp1, "quit") == 0)
{
return 0;
}
if(strcmp(temp1, "convert") != 0)
{
cout << "Error! Invalid command." << endl;
}
cin >> temp2;
if(strcmp(temp1, "convert") == 0)
{
for(int i=0; i<sizeof(temp2); i++)
{
if(isdigit(temp2[i]))
{
cout << atoi(&temp2[i]);
}
else if(s.rank(temp2[i]) < s.rank(s.head->data))
{
sNode temp = s.pop();
cout << temp.data;
}
else
{
s.push(temp2[i]);
}
}
}
else
{
cout << "Error! Command not supported." << endl;
}
}while(strcmp(temp1, "quit") != 0);

return 0;
}

Функция вызывается в

else if(s.rank(temp2[i]) < s.rank(s.head->data))

И проблема здесь:

            else if(x == '+' || x == '-')
{
num = 2;
// cout << "Checking if + or -" << endl;
return num;
// cout << "After return." << endl;
}

В частности, перед возвратом num я получаю сообщение об ошибке «Ошибка сегментации (дамп памяти)». Я использовал GDB, и все, что я знаю, это то, что сразу после «Проверка, + или -» я вижу «$ 1 = 2». Я не совсем уверен, что это значит, но это то, что я хочу вернуть.

Спасибо за помощь.

4

Решение

Исправление 1: написать правильный конструктор.

    stack()
{
head=NULL;
cout << "Initiliazing stack." << endl;
}

Исправление 2: напишите дополнительный метод, чтобы проверить, пуст ли стек.

int stack::empty()
{
if(head == NULL)
return true;
else
return false;
}

Исправление 3: проверьте, пустой ли стек перед использованием данных стека.

else if(!s.empty() && s.rank(temp2[i]) < s.rank(s.head->data))
{
...
}

Исправить 4: исправить остальную часть кода логики.

0

Другие решения

В вашем коде много ошибок. Ваша реализация стека неверна. push() например только наборы head снова и снова. Это приводит к тому, что ваш класс стека может содержать только один элемент. next никогда не устанавливается ни на что, поэтому он содержит случайный мусор. Далее у вас есть это:

for(int i=0; i<sizeof(temp2); i++)

sizeof(temp2) не дает вам количество символов строки temp2 указывает на. Это дает вам размер указателя temp2 сам. Кроме того, вы заканчиваете тем, что читаете s.head из пустого стека, который будет указателем на случайный мусор. В этот момент все ставки, конечно, не принимаются. Вы не можете ожидать ничего, кроме аварии и ожога.

1

По вопросам рекламы [email protected]