2015-03-26 3 views
-2

У меня есть структура называется записью, которая содержит ключ, значение пару:зЬгсра нарушение прав доступа написание переменной структуры

struct Record{ 
    char* key=new char(); 
    TYPE value=NULL; 
    Record(){ 
     key = "default"; 
     value = 10; 
    } 
    Record(const char* key_, TYPE value_){ 
     strcpy(key, key_); 

     value = value_; 
    } 
    const Record<TYPE>& operator=(const Record<TYPE>& other){ 
     key = other.key; 
     value = other.value; 
     return *this; 
    } 
}; 

Кроме того, у меня есть класс «SimpleTable», который содержит массив из этих записей:

class SimpleTable:public Table<TYPE>{ 

    struct Record<TYPE> *table; 

public: 

Проблема возникает, когда я пытаюсь поместить дату в эти записи. Моя strcpy дает мне «место записи нарушения доступа». (Все элементы массива Отчетов инициализируется в конструкторе класса):

template <class TYPE> 
bool SimpleTable<TYPE>::update(const char* key, const TYPE& value){ 
    for (int i = 0; i < 10; i++){ 
     if (table[i].key == ""){ 
      strcpy(table[i].key , key); // <-------- crash right here 
      table[i].value = value; 
     } 
    } 
     return true; 
} 
+0

'char * key = new char();' выделяет один символ. 'char * key = new char [10];' выделяет массив, который вам нужен. 'key = other.key;' в операторе присваивания также неверно. –

+0

вы выделяете один символ, затем переходите к копированию всей строки поверх нее, что вы ожидали? –

+0

Не зацикливайте идентификатор C, который на самом деле находится в нижнем регистре (ваш заголовок имел 'Strcpy', а не' strcpy', прежде чем я его отредактировал). Легко может быть и другая функция, называемая «Strcpy». –

ответ

1
char* key=new char(); 

только выделяет память для хранения одного символа.

strcpy(table[i].key , key); 

приведет к непредсказуемому поведению, если key не является пустой строкой.

Использование std::string key. Если вам не разрешено использовать std::string, вам придется пересмотреть код и исправить проблемы с памятью, связанные с key.

+0

Кроме того, 'key =" default ";' отбрасывает указатель на выделенный вами символ и заменяет его указателем на константу. Вы не можете изменить константу, поэтому теперь 'key' указывает на то, что вы не можете изменить. Поэтому попытка скопировать в него не удастся. (Чтобы скопировать что-то в указатель, указатель должен указать на то, что вы можете изменить.) –

Смежные вопросы