C ++为什么指针值改变了?

时间:2015-04-01 02:25:14

标签: 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 *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”一旦进入函数就会改变。

2 个答案:

答案 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;