Я работаю над BST для класса. В классе есть 5 файлов, 2 1/2 из которых я не могу редактировать (как упражнение в ООП). Я не могу редактировать data.h, driver.cpp или публичные члены bst.cpp.Ошибки исключения при использовании strcpy
У меня возникают ошибки при попытке использования strcpy в файле data.cpp. Это актуально, потому что моя функция вставки в bst.cpp отправляется объектом данных в качестве аргумента из драйвера.
Ошибки в форме
Unhandled exception at 0x0F3840D9 (msvcr120d.dll) in asgmt04.exe: 0xC0000005:
Access violation writing location 0x00000000.
Вот код
В bst.cpp
void BST::insert(const Data& data)
{
if (index > capacity)
grow();
if (items[index].isEmpty == true)
{
items[index].data.setName(data.getName());
nItems++;
items[index].isEmpty = false;
items[index].loc = index;
}
else if (data < items[index].data)
{
index = (2 * index) + 1;
insert(data);
}
else
{
index = (2 * index) + 2;
insert(data);
}
}
Опять же, я не могу изменить прототип функции, потому что это общественное член.
В data.h
char const * const getName() const { return name; }
В data.cpp
void Data::setName(char const * const name)
{
strcpy(this->name, name);
}
Я также попытался использовать перегруженный оператор = и столкнулся с той же проблемой. Код, который назвал это выглядело как
items[index].data = data; //second arg is the one passed into insert function
И data.cpp
Data& Data::operator=(const Data& data2)
{
strcpy(this->name, data2.name);
return *this;
}
Спасибо за любую помощь
Вы разыскиваете нулевой указатель. В идеале вы получите номер строки, где это происходит, возможно, запуская в отладчике. Вероятно, это либо ваш указатель, либо указатель this-> name. Добавьте подтверждения для проверки. – kec
@kec Это похоже на проблему. К сожалению, конструктор по умолчанию для объектов данных (который я не могу изменить) инициализирует имя NULL, и я инициализирую весь массив из них динамически при запуске программы. – FutureShocked