C++ 为什么指针值改变了?
C++ Why pointer value changed?
我刚刚测试了 linked link。但是,在我向列表中插入一个元素并且列表应该是引用类型后,传递给函数 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);
}
我调试的时候发现GetElement()函数中的参数"list"一进入函数就变了。
这里有个问题:
Node newNode;
...
p->next = &newNode; // <<== Using a pointer to local
上面的 newNode
是一个局部变量,一旦函数退出,它就会连同它的内存一起超出范围。这会导致未定义的行为,因为节点的内存已被释放。
改用 malloc
,您在 _tmain
中所做的方式将解决问题。更好的是,使用 new
,因为这是 C++,而 malloc
是 C 风格的分配。
修复此问题后,将弹出另一个与节点数有关的问题:您正在分配一个节点,该节点已分配给 head
,但未被使用。反正你传的是指针,所以应该传指针header
,通过双指针修改
您的程序表现出未定义行为的症状。未定义的行为是由 InsertElement
.
中的以下行引起的
Node newNode;
newNode.data = e;
newNode.next = p->next;
p->next = &newNode;
您正在 return 指向堆栈中对象的指针。一旦你从函数中 return 指针就无效了。稍后,在 GetElement
中,您正在访问该指针。
您需要改用什么:
Node* newNode = new Node;
newNode->data = e;
newNode->next = p->next;
p->next = newNode;
我刚刚测试了 linked link。但是,在我向列表中插入一个元素并且列表应该是引用类型后,传递给函数 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);
}
我调试的时候发现GetElement()函数中的参数"list"一进入函数就变了。
这里有个问题:
Node newNode;
...
p->next = &newNode; // <<== Using a pointer to local
上面的 newNode
是一个局部变量,一旦函数退出,它就会连同它的内存一起超出范围。这会导致未定义的行为,因为节点的内存已被释放。
改用 malloc
,您在 _tmain
中所做的方式将解决问题。更好的是,使用 new
,因为这是 C++,而 malloc
是 C 风格的分配。
修复此问题后,将弹出另一个与节点数有关的问题:您正在分配一个节点,该节点已分配给 head
,但未被使用。反正你传的是指针,所以应该传指针header
,通过双指针修改
您的程序表现出未定义行为的症状。未定义的行为是由 InsertElement
.
Node newNode;
newNode.data = e;
newNode.next = p->next;
p->next = &newNode;
您正在 return 指向堆栈中对象的指针。一旦你从函数中 return 指针就无效了。稍后,在 GetElement
中,您正在访问该指针。
您需要改用什么:
Node* newNode = new Node;
newNode->data = e;
newNode->next = p->next;
p->next = newNode;