指针不匹配和麻烦

Pointer Mismatches & Trouble

本文关键字:麻烦 不匹配 指针      更新时间:2023-10-16

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

注意,我更改了HTAdd的函数声明,以接收指向Node的指针的指针。因为你想修改向量的第一个元素的内容,这是一个Node*,你需要将Node**传递给HTAdd

编辑:我的原始代码并没有真正改变要连接到您试图添加的节点的第0个向量元素。以下是您将如何做到这一点。正如您所看到的,最后两个cout语句输出了vector的第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;
}

使用HTadd的定义

void HTadd (int k, Node *&ptr)

像你那样正常调用它。

reason:引用一个变量意味着给同一个位置不同的名字。如果你只使用Node * ptr,那么你只是通过值传递。即ptr是一个局部变量,它将具有buggy(即null)中值的副本。对ptr的操作不会影响buggy。因此,当ptr发生变化时,要对buggy进行更改,则通过引用传递buggy。所以ptr应该被声明为reference to a pointer to Node

编辑:现在根据下面的注释Node * buggy = tableP[1];将使buggy持有new node返回的地址(tableP[1]持有此地址)。现在在调用HTadd(26,buggy);之后,ptr = temp给buggy一个新值(coz temp = new node)。现在buggy指向别的东西,但tableP[1]是不变的,即tableP[1]->rest仍然是NULL,所以tableP[1]->rest->x没有意义。因此存在隔离故障。为什么tableP[1]没有被挂起?因为tableP[1]是一个变量,buggy是另一个变量,两者都是Node *类型,所以Node * buggy = tableP[1]只是复制tableP[1]的内容到buggy;

buggy为NULL,您正在延迟它。您通过值而不是引用传递指针,因此您更改了它的内容,而不是它指向的内容。