C++ 为什么指针值更改
C++ Why pointer value changed?
>我只是测试一个链接。但是,在我将元素插入列表后,传递到函数 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;
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么++(*p)更改指针值
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么指针不写入类的地址?
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 为什么要增加导致崩溃的指针
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 共享指针:为什么没有双免费
- 指向2D数组的指针(为什么起作用)
- 函数指针 - 为什么,什么时候我可以没有
- C++ 函数指针 -- 为什么会这样
- 不支持在c或c++中添加两个指针.为什么?
- 无效的指针-为什么
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么
- 在信号代码中将整数转换为函数指针-为什么这样做?
- 指向结构体作为函数参数的指针-为什么不更新其值