std :: cin >> * aa приводит к ошибке шины - PullRequest
0 голосов
/ 25 апреля 2010

У меня есть класс 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 ]

3 голосов
/ 25 апреля 2010

setCharString с подписью char *s[] разыменовывает первый элемент массива указателей до char*. Это не было выделено. Если вы измените объявление aa на char aa[1000];, оно, вероятно, запустится.

Есть и другие проблемы (также отмеченные другими). Присвоение переменной stringValue также разыменовывает память, которая, по-видимому, не была выделена. Трудно сказать, что такое использование, но, возможно, у него не должно быть объявления []. Кроме того, присваивание хранит указатель на стековую память, которая, вероятно, будет недействительной после другого вызова функции.

1 голос
/ 25 апреля 2010

char *aa[1000]; не то, что вы думаете. Это массив из 1000 char *.

Вместо этого используйте std::string. Таким образом, вам не нужно беспокоиться о том, что кто-то вводит более 1000 символов и использует вашу программу.

1008 * Е.Г. *

std::string input;
std::cin >> input;
1 голос
/ 25 апреля 2010

Когда вы говорите:

char *aa[1000];
std::cin >> *aa;

* aa не имеет выделенной памяти. Такая же проблема здесь:

char *stringValue[];

И имя __CPP_PPString зарезервировано в C ++, как и все имена, которые содержат двойное подчеркивание или начинаются с подчеркивания и заглавной буквы. Вам не разрешено создавать их в своем собственном коде,

0 голосов
/ 25 апреля 2010

Какой компилятор вы используете? Попробуйте использовать другой компилятор или включить все предупреждения для того, который вы используете, компилятор должен сообщать вам об ошибках этого кода, вам не нужно это выяснять во время выполнения.

Например, 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;
...