Почему я получаю сообщение об ошибке, когда пытаюсь использовать свою структуру? - PullRequest
1 голос
/ 22 июля 2010

У меня есть структура, определенная в файле заголовка для класса, в котором я работаю, и я пытаюсь использовать Struct в одном из методов класса.В основном это выглядит так:

struct example
{
     double a;
     int b;
     ...
};

в заголовке над моим определением класса, а затем в файле cpp, у меня есть:

void exampleclass::test(){

    struct example *teststruct;
    teststruct->a = 0; //This line causes a access violation

}

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

Ответы [ 3 ]

7 голосов
/ 22 июля 2010

Как насчет выделения памяти для вашей структуры?

что-то вроде:

example* teststruct = new example;
teststruct->a = 0;
4 голосов
/ 22 июля 2010

struct example *teststruct; - указатель на экземпляр структуры example.(Кстати, C ++ не требует префикса struct, оставьте его выключенным.)

Итак, на что же указывает example?(Подсказка: нет, вы не инициализировали переменную.) Вы можете динамически выделить один: example *teststruct = new example();, а затем удалить его: delete teststruct;. *

Конечно, вы должны предпочесть автоматический (стек)Распределение по динамическому распределению, и просто выполните:

example teststruct;
teststruct.a = 0;

* И вы никогда не должны обрабатывать необработанные выделения, как это.Поместите их в умный указатель.По крайней мере, std::auto_ptr.

3 голосов
/ 22 июля 2010

Как вы уже написали, teststruct указывает на какое-то случайное место в памяти, поэтому доступ к нему, выполнив teststruct->a = 0;, переводит вас в неопределенную область поведения. Таким образом, у вас может быть - если вам действительно повезет - мгновенная ошибка [например, нарушение доступа, ошибка шины, ошибка сегментации и т. Д.], Или она будет работать без проблем.

Вам нужно либо выделить память для teststruct, как сказал Макс, либо создать ее в стеке и сделать что-то вроде:

struct example teststruct;
teststruct.a = 0; //This line does not cause an access violation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...