gpt4 book ai didi

c++使用结构指针的段错误

转载 作者:行者123 更新时间:2023-11-30 01:01:34 26 4
gpt4 key购买 nike

我有一个名为 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)
};

我试图为这个类重载 [] 运算符,当我这样做时,我得到一个段错误错误

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

我相信段错误发生在这一行

array[size].value = 0;

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

最佳答案

当 C 和 C++ 中的数组具有 N 时元素,有效索引为:0, 1, 2, ... N-1 .对比N不是有效索引:它过去数组的末尾。

在这种特殊情况下,array最后 元素是array[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]正在访问超出数组的末尾并导致段错误。

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

这是“重新分配”,这就是std::vector<T>当它的增长超出其当前容量时会发生。

您可能希望将动态数组的使用替换为 std::vector<KeyValue> .那会让 std::vector照顾好这些操作。

关于c++使用结构指针的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58892068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com