C ++ ошибка указателя на символ

Я хочу инициализировать строку char * внутри структуры.

это структура:

typedef struct __String  {
char*    data;        // C-string data,
unsigned* copyRef;     // number of copy reference, delete only when the copyRef is 0
bool     isACopy;     // this boolean is true when *data is a ref to an other MyString

__String () {
data = 0;
isACopy = false;
copyRef = new unsigned();
*copyRef = 0;
return;
}

void addCopyRef() {
*copyRef++;
}

void removeCopyRef() {
*copyRef--;
}
} *MyString;

и это тот момент, когда это сбой ..

void Initialize(MyString& string){

string->data = new char[LENGHT];
string->data[0] ='\0'; // this generate an error!
string->addCopyRef();
}

это главное:

MyString left_string, right_string, both_string;
Initialize(left_string);
Initialize(right_string);
Initialize(both_string);

первый идет хорошо, второй нет ..
Не могли бы вы помочь мне понять, в чем проблема? Спасибо!

4

Решение

Вы должны выделить память для объектов, прежде чем передавать их следующим образом:

MyString left_string = new __String();
Initialize(left_string);

Как правило, такие typedefs не выполняются, они очень запутанные и подвержены ошибкам. Если вы решили напечатать указатель, по крайней мере, укажите, что это указатель в типе, т.е. typedef struct __String* MyStringPtr,

7

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

typedef struct __String  {
char*    data;        // C-string data,
unsigned* copyRef;    // number of copy reference,
// delete only when the copyRef is 0
bool     isACopy;     // this boolean is true when *data
// is a ref to an other MyString

__String () {
data = 0;
isACopy = false;
copyRef = new unsigned;
*copyRef = 0;
return;
}

void addCopyRef() {
*copyRef++;
}

void removeCopyRef() {
*copyRef--;
}
} *MyString;void Initialize(MyString& string){

string->data = new char[100];
string->data[0] ='\0'; // this generate an error!
string->copyRef = new unsigned();
string->addCopyRef();
}

int main()
{
MyString mystring = new struct __String;
Initialize(mystring);
}

Я тестировал, как это без каких-либо ошибок. с g ++ на Linux.
Я думаю тебе лучше

  • как минимум предоставьте здесь сообщение об ошибке
  • и ваш компилятор и платформа, на которой вы работаете.

Я проверил снова с другим main () ниже.

int main()
{
MyString mystring = new struct __String;
MyString mystring1 = new struct __String;
MyString mystring2 = new struct __String;
Initialize(mystring);
Initialize(mystring1);
Initialize(mystring2);
}

С этим тестовым кодом ошибки нет.
Я думаю, что вы пропустили создание объекта, на который указывает mystring (В вашем коде left_string, right_string, both_string).
Наверное, причина была бы в этом.

И этот код вызывает утечку памяти из конструктора. В этом состоянии кода конструктор не нужен.

2