使用结构指针的C ++分段错误

Zac*_*eck 1 c++ templates segmentation-fault

我有一个名为Dictionary的类,其中包含一个键值对,一个指向该键值对的指针以及一个保存字典大小的int值。

template<typename K, typename V>
class Dictionary
{
public:

V& operator[](K key);

private:

struct KeyValue
{
    K key;
    V value;
}; //the key-value pair struct

KeyValue* array; //pointer to an array of items (the key-value pairs)

int size; //size of the dictionary (i.e. the array size)
};
Run Code Online (Sandbox Code Playgroud)

我正在尝试重载此类的[]运算符,当这样做时,出现段错误错误

template<typename K, typename V>
V& Dictionary<K,V>::operator[](K key){
  for (size_t i = 0; i < size; i++) {
    if (key == array[i].key) {
      return array[i].value;
    }
  }
  array[size].value = 0;
  size++;
  return array[size-1].value;
}
Run Code Online (Sandbox Code Playgroud)

我相信该行中发生段错误

array[size].value = 0;
Run Code Online (Sandbox Code Playgroud)

但是,我不知道为什么会这样。任何帮助是极大的赞赏。谢谢!

Nic*_*asM 5

当C和C ++中的数组具有N元素时,有效索引为: 0, 1, 2, ... N-1。相反,N它不是有效的索引:它超出了数组的末尾。

在这种情况下,的最后一个元素arrayarray[size - 1]

array[0]         // first element
array[1]         // second element
// ...
array[size - 2]  // second-to-last element
array[size - 1]  // last element

array[size]      // error: beyond the last element
Run Code Online (Sandbox Code Playgroud)

使用array[size]正在访问超出在段故障阵列和结果的末尾。

从更大的角度看,如果您需要向数组中添加元素,并且数组空间不足,则需要分配一个更大的新数组,并将元素从旧数组移动(或复制)到新数组。数组。

这是“重新分配”,并且std::vector<T>当它超出当前容量时会执行此操作。

您可能需要将动态数组的使用替换为std::vector<KeyValue>。这样就std::vector可以处理这些操作。