[英]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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.