【问题标题】:C++ Why pointer value changed?C++ 为什么指针值改变了?
【发布时间】:2015-04-01 02:25:14
【问题描述】:

我只是测试一个链接。但是,在我向列表中插入元素后,不希望传递给函数 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”一进入函数就改变了。

【问题讨论】:

  • 你应该使用带有构造函数的类,malloc() 在 C++ 中应该避免使用,你也可以使用引用而不是指针
  • 当你通过值传递时,你会复制。传递给您的函数时,您已经复制了整个 LinkList。您应该通过引用传递。
  • 使用 typedef 隐藏指针会使代码更难阅读和维护。另外,为什么malloc 而不是new?更进一步,为什么要在main 开始动态分配?

标签: c++ pointers struct linked-list


【解决方案1】:

这里有个问题:

Node newNode;
...
p->next = &newNode; // <<== Using a pointer to local

newNode 上面是一个局部变量,一旦函数退出,它就会连同它的内存一起超出范围。这会导致未定义的行为,因为节点的内存已被释放。

改用malloc,您在_tmain 中所做的方式将解决问题。更好的是,使用 new,因为这是 C++,而 malloc 是 C 风格的分配。

一旦你解决了这个问题,就会弹出另一个与节点数量相关的问题:你正在分配一个分配给head的节点,但它没有被使用。由于您无论如何都在传递指向指针的指针,因此您应该将指针传递给header,并通过双指针对其进行修改。

【讨论】:

  • 谢谢!这些代码来自一个旧的 C 程序。我应该使用 new 而不是 malloc。
【解决方案2】:

您的程序出现了未定义行为的症状。未定义的行为是由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;

【讨论】:

  • 谢谢!这更有意义。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多