4

我有一个指向名为“表”的结构的指针数组(该结构称为节点)。

我在类中声明数组:

Node * table;

然后,在另一种方法中,我初始化表:

this->table = new Node [this->length];

一切正常。this->length 是一个有效的条目,this->table 指向正确的数组,等等。但是,然后我尝试更改元素的值:

for(int i = 0; i < this->length; i++) {
    this->table[i] = new Node;
}

甚至

for(int i = 0; i < this->length; i++) {
    this->table[i] = 0;
}

一切都开始出现问题。为什么我不能将这些指针设置为任何东西?

这是我得到的错误:在此处输入图像描述

(其中第 15 行是“this->table[i] = new Node;”的行)。

我讨厌发布长段代码,所以这里是代码本身的缩短版本:

template <class T, class S>
class HashMap {
    public:
        HashMap();
    private:
        struct Node;
        Node * table;
        static const unsigned length = 100;
};

template <class T, class S>
HashMap<T, S>::HashMap() {
    this->table = new Node [HashMap::length];
    for(int i = 0; i < HashMap::length; i++) {
        this->table[i] = new Node;
    }
}

template <class T, class S>
struct HashMap<T, S>::Node {
    T value;
    S key;
    Node * next;
};

我正在做的任何研究都没有告诉我错误是什么;任何帮助表示赞赏!

4

4 回答 4

4

您没有指针数组。你有一个节点数组。显然,你想要的是这样的:

Node ** table;
...
this->table = new Node*[this->length];

或者,也许您实际上并不需要一个指针数组,而只是一个节点数组。在这种情况下,不需要额外的初始化:

this->table = new Node[this->length];

除此之外,除非这是一个学习练习,否则请查看标准库,它为您准备好了动态数组哈希映射。

于 2013-08-14T04:37:03.393 回答
1

table不是指针数组。它是一个 s 数组Node(或者更确切地说,它指向一个Nodes 数组)。的类型tableNode*; 的类型table[i]Node,不是Node*

如果你真的想要一个指针数组,那么你需要

Node** table;
table = new Node*[length];

或者更好的是,像

vector<unique_ptr<Node>> table;
table.resize(length);
于 2013-08-14T04:38:52.663 回答
0

您没有声明一个指针数组。
Node *table(指向一个节点)
Node **table(指向一个数组Nodes)

Node** table;
table =new Node*[this->length];
for(int i=0;i<this->length;i++)
{
   table[i]=new Node;
} 
于 2013-08-14T05:01:09.320 回答
0
this->table = new Node [HashMap::length];

this->table是类型Node*并且 new Node [HashMap::length] 也返回一个 Node* ,即HashMap::length创建一个长度为 Node 的数组,并将数组地址存储在this->table指针中。

this->table[i] = new Node;

例如,我们可以定义:

int* arr = new int[10];

这里 arr 是 int* 类型,但arr[0]将是 int 类型。

同样,this->table[i]是 Node 类型,new Node 返回 Node*。因此不兼容的类型。正确的行是

this->table[i] = *new Node;

但是,这一行是不必要的,因为节点数组已经创建并分配了内存。在代码中使用这一行将导致内存泄漏。

于 2013-08-14T09:08:26.903 回答