Я пытался заставить этот код работать довольно долго и, к сожалению, я всегда получал NullReferenceException
, Я обнаружил, что этот код работает, если не использовать указатели на класс, но я не понимаю, почему указатели могут вызывать это исключение. Кстати, я не очень разбираюсь в c ++, поэтому было бы любезно объяснить это простым способом. Заранее спасибо.
class Box
{
public: char* data;
};
int Main()
{
Box* a;
a->data = "Hello World";
return 0;
}
Box* a;
объявляет указатель к Box
объект. Ты никогда Создайте Box
объект так a
ни на что не указывает.
Поведение письма a->data
следовательно является не определено.
Либо перетащите указатель, чтобы вы получили Box a;
или используйте Box* a = new Box();
, В последнем случае не забудьте позвонить delete a;
в какой-то момент вы потеряете память.
Наконец, написание a->data = "Hello World";
может быть проблематично: a->data
будет указателем на только для чтения строковый литерал; поведение при попытке изменить содержимое этого буфера не определено.
Гораздо лучше использовать std::string
как тип для a
,
Указатель просто указывает на (надеюсь) выделенный фрагмент памяти. В вашем примере указатель неинициализирован, и поэтому вы пытаетесь установить память, к которой у вас нет доступа.
Вы должны убедиться, что он указывает на что-то действительное, например:
int Main()
{
Box box; // stack allocation
Box* a = &box; // you could also call new Box; here
a->data = "Hello World";
return 0;
}
Значение a
не определено, потому что вы никогда не устанавливаете его на что-либо. Поэтому все может случиться. Скорее всего, вы обращаетесь к не принадлежащей вам памяти, вызывая ошибку сегментации или подобное исключение доступа. Это то, что произошло.
Не делай этого. Определите свой адрес в терминах адреса переменной того же типа, который уже определен.
указатель к Box
объект не Box
объект. Указатель Box* a
указывает на несуществующий объект, поэтому вы получаете сообщение об ошибке, когда пытаетесь назначить «Hello World» члену.
Вы должны создать Box
объект либо путем создания его «в стеке» с продолжительность автоматического хранения:
Box a;
или создав его «в кучу» с продолжительность динамического хранения:
Box* a = new Box;
и удалите его после использования:
delete a;
a
не инициализирован (или не назначен), это просто повисший указатель. Любое разыменование на нем будет Неопределенное поведение.
Вы могли бы Box* a = new Box
, или же Box b; Box* a = &b
сделать указатель действительным. например
Box* a = new Box;
a->data = "Hello World";
...
delete a;