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;
Другие вопросы по тегам