C++ 为什么指针值更改

C++ Why pointer value changed?

本文关键字:指针 为什么 C++      更新时间:2023-10-16

>我只是测试一个链接。但是,在我将元素插入列表后,传递到函数 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;

您正在返回指向堆栈上对象的指针。从函数返回后,指针无效。稍后,在 GetElement 中,您将访问该指针。

您需要改用什么:

Node* newNode = new Node;
newNode->data = e;
newNode->next = p->next;
p->next = newNode;