std::cin >> *aa приводит к ошибке шины
У меня есть этот класс с именем PPString:
PPString.h
#ifndef __CPP_PPString
#define __CPP_PPString
#include "PPObject.h"
class PPString : public PPObject {
char *stringValue[];
public:
char *pointerToCharString();
void setCharString(char *charString[]);
void setCharString(const char charString[]);
};
#endif
PPString.cpp
#include "PPString.h"
char *PPString::pointerToCharString() {
return *stringValue;
}
void PPString::setCharString(char *charString[]) {
*stringValue = *charString;
}
void PPString::setCharString(const char charString[]) {
*stringValue = (char *)charString;
}
Я пытаюсь установить stringValue
с помощью std::cin
:
main.cpp
PPString myString;
myString.setCharString("LOLZ");
std::cout << myString.pointerToCharString() << std::endl;
char *aa[1000];
std::cin >> *aa;
myString.setCharString(aa);
std::cout << myString.pointerToCharString() << std::endl;
Первый, который использует const char
работает, но второй, с char
нет, и я получаю этот вывод:
скопировать и вставить из STDOUT
LOLZ
im entering a string now...
Bus error
где вторая строка - то, что я ввел, после чего нажмите return
ключ.
Может кто-нибудь помочь мне исправить это? Спасибо...
4 ответа
SetCharString с char *s[]
сигнатура разыменовывает первый элемент массива указателей на char*
, Это не было выделено. Если вы измените декларацию aa
в char aa[1000];
, это, вероятно, будет работать.
Есть и другие проблемы (также отмеченные другими). Присвоение переменной stringValue
также разыменование памяти, которая, по-видимому, не была выделена. Трудно сказать, что такое использование, но, возможно, не должно иметь []
декларация. Кроме того, присваивание хранит указатель на стековую память, которая, вероятно, будет недействительной после другого вызова функции.
char *aa[1000];
это не то, что вы думаете. Это массив из 1000 char *
"S.
использование std::string
вместо. Таким образом, вам не нужно беспокоиться о том, что кто-то вводит более 1000 символов и использует вашу программу.
Например
std::string input;
std::cin >> input;
Когда ты сказал:
char *aa[1000];
std::cin >> *aa;
* aa не имеет выделенной памяти. Такая же проблема здесь:
char *stringValue[];
И имя __CPP_PPString
зарезервировано в C++, как и все имена, которые содержат двойное подчеркивание или начинаются с подчеркивания и заглавной буквы. Вы не можете создавать их в своем собственном коде,
Какой компилятор вы используете? Попробуйте использовать другой компилятор или включить все предупреждения для того, который вы используете, компилятор должен сообщать вам об ошибках этого кода, которые вам не нужно выяснять во время выполнения.
Например, Comeau онлайн скажет вам:
"ComeauTest.c", line 4: error: incomplete type is not allowed
char *stringValue[];
^
"ComeauTest.c", line 23: warning: variable "aa" is used before its value is set
std::cin >> *aa;