Странные ошибки доступа к структуре

0

В основном у меня есть этот код:

#include <iostream>
using namespace std;

    struct foo{
        string *question;
        //other elements
    };

    int main(){
        foo *q;
        foo *q2;
        q->question = new string("This is a question"); 
        //q2->question = new string("another question");
    }

и когда я раскомментирую q2->question = new string("another question"); это ошибки, и я понятия не имею, почему.

Обновление: ошибка представляет собой сообщение Windows, в котором говорится, что программа перестала работать, и она печатает Process exited with return value 3221225477

  • 0
    Какие ошибки вы получаете?
  • 0
    Процесс завершен с возвращаемым значением 3221225477
Показать ещё 8 комментариев
Теги:
struct

3 ответа

3
Лучший ответ

Ваши q и q2 указатели не инициализированы. Вы пытаетесь получить доступ к памяти, которую вы не выделили. В краткосрочной перспективе исправить:

int main(){
    foo *q = new foo;
    foo *q2 = new foo;
    q->question = new string("This is a question"); 
    q2->question = new string("another question");

    // don't forget to release the memory you allocate!
    delete q->question;
    delete q2->question;
    delete q;
    delete q2;

}

Лучшее решение в этом случае - не использовать указатели... нет абсолютно никакой необходимости. Используйте стек, и вам не нужно иметь дело с указателями, и нет необходимости освобождать.

int main(){
    string q1 = "This is a question";
    string q2 = "another question";
}
1
foo *q;
foo *q2;

Вы получаете Undefined Behavior при использовании косвенности на этих указателях, потому что эти указатели не были инициализированы (т.е. они не указывают на действительный адрес).

Вам нужно указать, что они указывают на объект:

foo* q  = new foo();
foo* q2 = new foo();

// don't forget to delete

или просто использовать распределение стека:

foo q;
foo q2;

q.question = "This is a question";
1

Вы не выделили память для q и q2.

замещать

foo *q;
foo *q2;

с

foo *q = new foo();
foo *q2 = new foo();

В конце удалите все созданные объекты:

delete q->question;
delete q;
delete q2->question;
delete q2;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню