尝试创建指针向量,然后将每个指针设置为NULL。然后我想让向量的某个部分连接到我分配的节点。我在与不匹配方面遇到了一些困难。我还想添加新节点后面的内容。任何反馈都会很友好。我不断遇到段错误。
struct Node{
int x;
Node* rest;
};
void HTadd (int k, Node *ptr)
{
Node* temp = new Node
temp->x = k;
temp->rest= ptr;
ptr = temp;
}
int main ()
{
vector <Node *> tableP;
for (int i = 0; i < 10; i++){
tableP.push_back(NULL);}
Node * buggy = tableP[0];
HTadd(26, buggy);
cout << buggy->key << endl;
return 0;
}
答案 0 :(得分:4)
请注意,我更改了HTAdd
的函数声明,以获取指向Node
的指针。由于您要修改向量的第一个元素(Node*
)的内容,因此您需要将Node**
传递给HTAdd
。
编辑:我的原始代码并没有真正改变要连接到您尝试添加的节点的第0个向量元素。这是你如何做到的。如您所见,最后两个cout
语句打印向量的第0个元素和buggy
的内容,它们指向相同的地址。
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int x;
Node* rest;
};
void HTadd (int k, Node **ptr) {
Node* temp = new Node;
temp->x = k;
temp->rest= *ptr;
*ptr = temp;
}
int main ()
{
vector<Node*> tableP;
for (int i = 0; i < 10; i++){
tableP.push_back(NULL);
}
HTadd(26, &tableP[0]);
Node *buggy = tableP[0];
cout << tableP[0]->x << endl;
cout << buggy->x << endl;
cout << tableP[0] << endl;
cout << buggy << endl;
return 0;
}
答案 1 :(得分:3)
错误是NULL并且您正在引用它。您是按值而不是通过引用传递指针,因此您更改其内容,但不更改它指向的内容。更改HTAdd以将指针引用作为其第二个参数。
答案 2 :(得分:3)
使用HTadd的定义
void HTadd (int k, Node *&ptr)
像你一样正常打电话。
原因:引用变量意味着为同一位置指定不同的名称。如果你只使用Node * ptr
,那么你只是通过值传递。即ptr
是一个局部变量,其中包含buggy
中值的副本(null
)。您对ptr
的操作不会影响buggy
。因此,要在更改buggy
时对ptr
进行更改,请通过引用传递buggy
。所以ptr
应声明为reference to a pointer to Node
编辑:现在根据下面的评论Node * buggy = tableP[1];
将错误保留new node
返回的地址(tableP [1]持有此地址)。现在在调用HTadd(26,buggy);
之后,错误被ptr = temp
(coz temp = new node)赋予了新值。现在越野车指向其他东西,但tableP [1]没有变化,tableP[1]->rest
仍然是NULL
所以tableP [1] - &gt; rest-&gt; x没有任何意义。因此seg故障。
tableP [1]为什么没有改变? coz tableP [1]是一个变量,buggy
是Node *类型的另一个变量,因此Node * buggy = tableP[1]
jus将tableP [1]的内容复制到buggy;