2013-02-28 114 views
0

我正在做家庭作業,我有一個奇怪的問題,我希望有人可以幫助我。我在我的代碼中間有一個函數:爲什麼指針地址在返回時改變?

Token scheme::addScheme(vector <Token> toAdd) 
{ 

//Check if scheme is valid 
Token answer = isSchemeValid(toAdd); 
if (answer.retType() != "ok") 
{ 
    return answer; 
} 

identifierList * arrow = new identifierList(&(toAdd.at(0)), NULL); 
idList = arrow; 

for (int i = 2; i < toAdd.size()-1; i++) 
{ 
    (*arrow).id = &(toAdd.at(i)); 
    (*arrow).next= new identifierList(&(toAdd.at(0)), NULL); 
    arrow = (*arrow).next; 
} 


*id = toAdd.at(0); 
openParen = '('; 
closeParen = ')'; 

return Token("ok", "ok", 0); 
} 

這段代碼做了我需要它做的一切,除了最後。它正確地將所有變量設置爲我所需要的。這是它不起作用的地方:我一步一步地運行它,然後在運行最後一行 return token(「ok」,「ok」,0)後看到它。 idList的值從合法值更改爲瘋狂值(例如,idList的行號中的第一個id從2更改爲-17891602。

如果我爲標識列表和使用命名空間std #PRAGMA一次 ; 的#include 的#include 的#include 的#include 的#include 「datalogProgram.h」

enum state {COMMA, PERIOD, Q_MARK, LEFT_PAREN, RIGHT_PAREN, COLON, COLON_DASH, MULTIPLY, ADD, SCHEMES, FACTS, RULES, QUERIES, ID, STRING, COMMENT, WHITESPACE, UNDEFINED, ENDOFFILE, START}; 

class Token 
{ 
friend class datalogProgram; 

public: 
int lineNumber; 
string type; 
string value; 

Token(string inType, string inValue, int inLineNum); 
void route(state inState, string inValue, int inLineNum); 
string retType(); 
string retValue(); 

//A list of a bunch of functions that don't matter here. 
}; 

而一個已識別:令牌包括: 令牌RLIST:

class identifierList 
{ 
friend class scheme; 
public: 
Token * id; 
identifierList * next; 

identifierList(Token * inId, identifierList * inNext); 
}; 

我沒有得到它 - 爲什麼任何時候我做的是從函數返回變化的變量?

+3

爲了便於閱讀,在'(* arrow).id'之上選擇'arrow-> id'。 – 2013-02-28 21:11:58

+0

您正在按值向量傳遞'toAdd',因此您正在接收向量及其內容的副本。然後你正在使用向量元素的地址:'&(toAdd.at(i))'。當你離開函數時,vector的拷貝被破壞,指針不再有效。改變'addScheme'的簽名來接受引用 – 2013-02-28 21:20:57

回答

0

發生這種情況是因爲矢量toAdd是按值傳遞而不是通過引用傳遞的。會發生什麼是您傳遞到addScheme函數的向量被複制到堆棧。

現在,聲明(&(toAdd.at(0))和類似聲明採用矢量中位置0的任何參考。這意味着它返回一個指向棧上位置的指針。

一旦你的函數返回,堆棧就會被清除,並且指向棧上位置的指針將包含垃圾。

要解決這個問題,要麼通過引用傳遞向量,要麼更好地避免(&(toAdd.at(0)),因爲這是一個非常奇怪的契約,可能永遠不會按照您的預期工作。

+0

David的那個向量 - 這真的是我讀過的最有用的東西,用於回答我的問題,我第一次看到100%回答我的問題的答案 - 不僅僅是爲了幫我做作業,但幫助我學習。非常感謝你! – user1311736 2013-03-01 03:22:52

+0

我很高興我能幫到 – 2013-03-01 06:22:41

+0

哦 - 對 - 阿隆。我現在看到大衛剛剛編輯它。對不起,仍然是堆棧溢出noobie。謝謝! – user1311736 2013-03-01 20:24:53

相關問題