C++ C++;为什么指针值会改变?

C++ C++;为什么指针值会改变?,c++,pointers,struct,linked-list,C++,Pointers,Struct,Linked List,我只是在测试一个链接。但是,在我向列表中插入元素后,传递给函数GetElement()的列表地址不是预期的,列表应该是引用类型。我就是不明白为什么 这是我的主要节目: #include "stdafx.h" #include <string> #include <iostream> typedef struct Node { int data; struct Node *next; } Node; typedef struct Node *LinkLi

我只是在测试一个链接。但是,在我向列表中插入元素后,传递给函数GetElement()的列表地址不是预期的,列表应该是引用类型。我就是不明白为什么

这是我的主要节目:

#include "stdafx.h"
#include <string>
#include <iostream>

typedef struct Node
{
    int data;
    struct Node *next;
} Node;

typedef struct Node *LinkList;

void InsertElement(LinkList *header, int i, int e)
{
    LinkList p = *header;
    int j = 0;

    while (p && j < i)
    {
        p = p->next;
        j++;
    }

    if (!p || j > i)
        return;

    Node newNode;
    newNode.data = e;
    newNode.next = p->next;

    p->next = &newNode;
}

void GetElement(LinkList list, int i, int *value)
{
    LinkList p = list->next;
    int j = 1;
    while (p && j < i)
    {
        p = p->next;
        j++;
    }
    if (!p || j >= i)
        return;

    *value = p->data;
}
int _tmain(int argc, _TCHAR* argv[])
{
    LinkList header = (LinkList)malloc(sizeof(Node));
    header->next = NULL;

    InsertElement(&header, 0, 1);
    int res = -1;
    GetElement(header, 1, &res);

}
#包括“stdafx.h”
#包括
#包括
定义表结点
{
int数据;
结构节点*下一步;
}节点;
typedef结构节点*链接列表;
void InsertElement(链接列表*标题,int i,int e)
{
链接列表p=*标题;
int j=0;
而(p&jnext;
j++;
}
如果(!p | | j>i)
返回;
节点newNode;
newNode.data=e;
newNode.next=p->next;
p->next=&newNode;
}
void GetElement(链接列表、int i、int*值)
{
链接列表p=列表->下一步;
int j=1;
而(p&jnext;
j++;
}
如果(!p | | j>=i)
返回;
*值=p->数据;
}
int _tmain(int argc,_TCHAR*argv[]
{
LinkList头=(LinkList)malloc(sizeof(Node));
header->next=NULL;
插入元素(&标题,0,1);
int res=-1;
GetElement(标题、1和res);
}
调试时,我发现函数GetElement()中的参数“list”在进入函数后发生了更改

这里有一个问题:

Node newNode;
...
p->next = &newNode; // <<== Using a pointer to local
Node新建节点;
...

p->next=&newNode;// 您的程序正在显示未定义行为的症状。未定义的行为是由
InsertElement
中的以下行引起的

Node newNode;
newNode.data = e;
newNode.next = p->next;

p->next = &newNode;
您正在返回指向堆栈上对象的指针。从函数返回后,指针无效。稍后,在
GetElement
中,您将访问该指针

您需要使用什么来代替:

Node* newNode = new Node;
newNode->data = e;
newNode->next = p->next;

p->next = newNode;

在C++中,应该使用一个构造函数类,即代码> MalCube()/<代码>,当您通过值传递副本时,可以使用引用而不是引用。在传递到函数时,您已经复制了整个链接列表。您应该改为通过引用传递。使用typedef隐藏指针会使代码更难阅读和维护。另外,为什么
malloc
而不是
new
?而且,为什么要在
main
中动态分配呢?谢谢!那就更有意义了。谢谢!这些代码来自一个旧的C程序。我应该用新的代替malloc。