@Conqueror3
Энтузиаст

Как исправить ошибку сегментирования?

Я где-то накосячил с указателями и не могу найти где именно. Вот код
#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstring>

using namespace std;

struct poezd
{
	char* fio;		// Пассажир
	char* point_from;	// Пункт отправления
	char* point_to;		// Пункт прибытия
	double price;		// Цена билета
};

vector <poezd> one;

poezd push_bilet(int* n);		// Функция заталкивания пассажира в базу данных с билетами - покупка билета

void help();						// Команда-функция-хэлпер

int main()
{
	setlocale(LC_ALL,"RU");

	int n=0;		// Кол-во пассажиров в поезде

	cout<<"Вас приветствует веселый кондуктор. Чтобы выйти из программы введите exit. Для получения справки воспользуйтесь --help. Приятной работы!"<<"/n";
	
	char* command;		
	while(strcmp(command, "exit") == 1);
	{
		cout<<"~shell>> ";
		cin>>*command;

		if(strcmp(command, "--help") == 0)
		{
			help();
		}
		
		if(strcmp(command, "new_persone") ==0)
		{
			push_bilet(&n);
		}	
		
	}
}

poezd push_bilet(int* n)
{	
	poezd neki;		// neki - это объект структуры poezd он создается каждый раз при вызове 
	cout<<"Введите Имя, Фамилию, Отчество/n"<<"~new>> "<<"/n";
	cin>> one.at(*n).fio;

	cout<<"Введите пункт отправления/n"<<"~new>> "<<"/n";
	cin>> one.at(*n).point_from;

	cout<<"Введите пункт назначения/n"<<"~new>> "<<"/n";
	cin>> one.at(*n).point_to;

	cout<<"Введите цену билета/n"<<"~new>> "<<"/n";
	cin>> one.at(*n).price;
}

void help()
{
	cout<<"--help - помощь по шел коду";
	cout<<"new_persone - новый человек - новый билет";
}


gdb выдает следующее
(gdb) run
Starting program: /root/a.out 

Program received signal SIGSEGV, Segmentation fault.
__strcmp_ssse3 () at ../sysdeps/x86_64/multiarch/../strcmp.S:173
173	../sysdeps/x86_64/multiarch/../strcmp.S: Нет такого файла или каталога.
(gdb)


P.S. Еще один маленький вопросец! Как изменить вызов функции push_bilet если вектор vector <poezd> one; объявить внутри тела main, и как потом вернуть экземпляр вектора оттуда?
  • Вопрос задан
  • 1249 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
gdb выдает следующее

Остаётся узнать как работают команды gdb bt, up, down и frame, и можно будет ответить на свой вопрос самостоятельно.

Но в данном случае всё очевидно:
char* command;		
  while(strcmp(command, "exit") == 1);

Три ошибки в двух строках: во-первых, command не инициализирована на момент вызова strcmp, и это вызывает SEGFAULT.
Во-вторых strcmp возвращает 0 при равенстве, <0 или >0 (не обязательно 1) при неравенстве строк.
В-третьих ';' после while () явно лишняя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы