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;