当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用结构指针的C++分段错误》经验,为你挑选了1个好方法。

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

template
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)
};

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

template
V& Dictionary::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;
}

我相信该行中发生段错误

array[size].value = 0;

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



1> NicholasM..:

当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

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

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

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

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

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有