指针不匹配&麻烦

时间:2013-03-14 04:18:45

标签: c++ pointers

尝试创建指针向量,然后将每个指针设置为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;
}

3 个答案:

答案 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;