我只测试一个链接链接。但是,在向列表中插入元素并且列表应该是引用类型之后,不期望传递给函数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”一旦进入函数就会改变。
答案 0 :(得分:1)
这是一个问题:
Node newNode;
...
p->next = &newNode; // <<== Using a pointer to local
上面的 newNode
是一个局部变量,一旦函数退出,就会超出范围及其内存。这会导致未定义的行为,因为节点的内存已被释放。
使用malloc
代替_tmain
中的方法,可以解决问题。更好的是,使用new
,因为这是C ++,malloc
是C风格的分配。
修复此问题后,将弹出另一个与节点数相关的问题:您正在分配一个分配给head
的节点,但它未被使用。由于您无论如何都要将指针传递给指针,因此您应该将指针传递给header
,并通过双指针修改它。
答案 1 :(得分:0)
您的程序显示出未定义行为的症状。未定义的行为是由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;