2015-04-01 123 views
1

我只是測試一個鏈接的鏈接。但是,向列表中插入元素並且該列表應該是引用類型後,傳遞給函數GetElement()的列表地址不是預期的。我只是不明白爲什麼。C++爲什麼指針值改變了?

這是我的主要程序:

#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參數「表」()更換一次進入該功能。

+0

您應該使用一類具有一個構造函數,'的malloc()'應避免在C++中,還當你路過,你可以使用引用代替指針 – 2015-04-01 02:29:41

+0

值你複製。傳遞給你的函數時,你已經複製了整個LinkList。你應該通過引用來代替。 – OmnipotentEntity 2015-04-01 02:29:53

+0

使用typedef隱藏指針會使代碼更難讀取和維護。另外,爲什麼'malloc'而不是'new'?而且,爲什麼要在'main'中動態分配? – PaulMcKenzie 2015-04-01 02:29:59

回答

1

這裏是一個問題:上述

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

newNode是一個局部變量超出範圍,以其存儲器,只要函數退出沿。這會導致未定義的行爲,因爲節點的內存已被釋放。

改爲使用malloc,您在_tmain中的做法將解決該問題。更好的是,使用new,因爲這是C++,並且malloc是C風格的分配。

修復此問題後,將彈出與節點數量相關的另一個問題:您正在分配一個分配給head的節點,但該節點未被使用。既然傳給指針的指針,你應該傳遞一個指向header的指針,並通過一個雙指針來修改它。

+0

謝謝!這些代碼來自舊的C程序。我應該用new來代替malloc。 – 2015-04-01 20:40:11

0

您的程序正在展示未定義行爲的症狀。未定義的行爲是由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; 
+0

謝謝!這樣做更有意義。 – 2015-04-01 20:38:29