C++ C++;为什么指针值会改变?
我只是在测试一个链接。但是,在我向列表中插入元素后,传递给函数GetElement()的列表地址不是预期的,列表应该是引用类型。我就是不明白为什么 这是我的主要节目: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
#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。